543 lines
23 KiB
JavaScript
543 lines
23 KiB
JavaScript
const base_url = "https://oss110metz.rezo-rm.fr/"
|
|
|
|
var page = ['#main-page', '#admin-page', '#login-page', '#demande-page'];
|
|
window.onpopstate = history.onpushstate = function(e) {
|
|
if (e.state) {
|
|
show_page(e.state, true);
|
|
} else {
|
|
history.back();
|
|
}
|
|
};
|
|
history.pushState("#main-page", "", "")
|
|
|
|
function show_page(id, historyPush) {
|
|
for(i in page) {
|
|
$(page[i]).hide();
|
|
}
|
|
$(id).show();
|
|
if (!historyPush) {
|
|
history.pushState(id, "", "")
|
|
}
|
|
}
|
|
|
|
$("#login-button").click(function (e) {
|
|
var data = JSON.stringify({
|
|
user: $("#login").val(),
|
|
password: $("#password").val()
|
|
});
|
|
$("#password").val('');
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "login",
|
|
data: data,
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
localStorage.setItem("token", data.token);
|
|
localStorage.setItem("user", data.user.uid);
|
|
localStorage.setItem("isAdmin", data.user.isAdmin);
|
|
if (data.user.isAdmin) {
|
|
show_page('#admin-page');
|
|
get_admin("prank");
|
|
} else {
|
|
show_page('#demande-page');
|
|
}
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
|
|
}
|
|
});
|
|
|
|
});
|
|
|
|
$("#prank-button").click(function () {
|
|
if (localStorage.getItem('token')) {
|
|
show_page('#demande-page');
|
|
}
|
|
else {
|
|
show_page('#login-page');
|
|
}
|
|
});
|
|
|
|
$("#logo").click(function () {
|
|
if (localStorage.getItem('token')) {
|
|
if (localStorage.getItem('isAdmin')) {
|
|
show_page('#admin-page');
|
|
// Load prank by default
|
|
get_admin("prank");
|
|
}
|
|
else {
|
|
show_page('#demande-page');
|
|
}
|
|
}
|
|
else {
|
|
show_page('#login-page');
|
|
}
|
|
});
|
|
|
|
$("#admin-prank").click(() => {
|
|
get_admin("prank");
|
|
})
|
|
$("#admin-treasure").click(() => {
|
|
get_admin("treasure");
|
|
})
|
|
$("#admin-activity").click(() => {
|
|
get_admin("activity");
|
|
})
|
|
|
|
function get_admin(type) {
|
|
$("#admin-content").empty();
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "get",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
type: type,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
switch (type) {
|
|
case "prank":
|
|
let doneCnt = 0;
|
|
let prankData = [];
|
|
for (prankUid in data.prankData) {
|
|
data.prankData[prankUid].prankUid = prankUid;
|
|
prankData.push(data.prankData[prankUid]);
|
|
}
|
|
prankData.sort((a, b) => new Date(a.date) - new Date(b.date));
|
|
for (entry in prankData) {
|
|
switch (prankData[entry].type) {
|
|
case "crêpe":
|
|
if (prankData[entry].state == "Pending"
|
|
|| prankData[entry].state == "Accepted") {
|
|
$("#admin-content").append(`
|
|
<span id="${prankData[entry].prankUid}" class="prank">
|
|
<div class="prank-title">Demande de crêpe par ${prankData[entry].creator}</div>
|
|
<div class="prank-amount">Quantité: ${prankData[entry].amount}</div>
|
|
<div class="prank-supplement">Garniture: ${prankData[entry].supplement}</div>
|
|
<div class="prank-where">Livraison: ${prankData[entry].where}</div>
|
|
<div class="prank-note">Livraison: ${prankData[entry].note}</div>
|
|
<span class="prank-footer">
|
|
<div class="prank-uid">UID: ${prankData[entry].prankUid}</div>
|
|
<div class="prank-date">UID: ${prankData[entry].date}</div>
|
|
</span>
|
|
<span class="prank-btn">
|
|
<div class="prank-btn-accept" style="display: ${(prankData[entry].state == "Accepted" && prankData[entry].manageBy == localStorage.getItem("user")) ? "none" : "flex"};">${(prankData[entry].state == "Pending") ? "Accepter" : "Récupérer (accepté par: "+prankData[entry].manageBy+")"}</div>
|
|
<div class="prank-btn-refused">Refuser</div>
|
|
<div class="prank-btn-done" style="display: ${(prankData[entry].state == "Accepted" && prankData[entry].manageBy == localStorage.getItem("user")) ? "flex" : "none"};">Done</div>
|
|
</span>
|
|
</span>
|
|
`)
|
|
} else if(prankData[entry].state == "done") {
|
|
doneCnt++;
|
|
}
|
|
break;
|
|
case "kidnap":
|
|
// Not Handle
|
|
break;
|
|
}
|
|
}
|
|
$("#admin-content").append(`
|
|
<span class="prank">
|
|
<div id=prankDone>Nombre totale de mission achevées: ${doneCnt}</div>
|
|
</span>
|
|
`);
|
|
break;
|
|
case "treasure":
|
|
let treasureData = [];
|
|
for (treasureUid in data.treasureData) {
|
|
data.treasureData[treasureUid].treasureUid = treasureUid;
|
|
treasureData.push(data.treasureData[treasureUid]);
|
|
}
|
|
treasureData.sort((a, b) => new Date(a.date) - new Date(b.date));
|
|
for (entry in treasureData) {
|
|
if (treasureData[entry].state == "Pending") {
|
|
$("#admin-content").append(`
|
|
<span id="${treasureData[entry].treasureUid}" class="treasure">
|
|
<div class="treasure-title">Demande de vérification par ${treasureData[entry].creator}</div>
|
|
<div class="treasure-activity">Activité: ${treasureData[entry].activity.title}</div>
|
|
<div class="treasure-desc">Description: ${treasureData[entry].desc}</div>
|
|
<div class="treasure-image">Image: <a href="${base_url}static/images/${treasureData[entry].image}" target="_blank">lien</a></div>
|
|
<span class="treasure-footer">
|
|
<div class="treasure-uid">UID: ${treasureData[entry].treasureUid}</div>
|
|
<div class="treasure-date">UID: ${treasureData[entry].date}</div>
|
|
</span>
|
|
<span class="treasure-btn">
|
|
<div class="treasure-btn-accept">Accepter</div>
|
|
<div class="treasure-btn-refused">Refuser</div>
|
|
</span>
|
|
</span>
|
|
`)
|
|
}
|
|
}
|
|
break;
|
|
case "activity":
|
|
$("#admin-content").append(`
|
|
<span id="addActivity" class="activity">
|
|
<label for="activityType">Choisir une option:</label>
|
|
<select name="type" id="activityType">
|
|
<option value="event">Event</option>
|
|
<option value="treasure">Trésor</option>
|
|
</select>
|
|
<div class="activity-title">Titre: <textarea class="admin-textarea"></textarea></div>
|
|
<div class="activity-desc">Description: <textarea class="admin-textarea"></textarea></div>
|
|
<div class="activity-where">Lieu: <textarea class="admin-textarea"></textarea></div>
|
|
<div class="activity-start">Début: <input type="datetime-local" class="admin-input-date"></input></div>
|
|
<div id="activity-end-add" class="activity-end">Fin: <input type="datetime-local" class="admin-input-date"></input></div>
|
|
<span class="activity-btn">
|
|
<div id="activity-btn-add">Ajouter une activité</div>
|
|
</span>
|
|
</span>
|
|
`)
|
|
let activityData = [];
|
|
for (activityUid in data.activityData) {
|
|
data.activityData[activityUid].activityUid = activityUid;
|
|
activityData.push(data.activityData[activityUid]);
|
|
}
|
|
activityData.sort((a, b) => new Date(a.start) - new Date(b.start));
|
|
for (entry in activityData) {
|
|
if (activityData[entry].type = "event") {
|
|
$("#admin-content").append(`
|
|
<span id="${activityData[entry].activityUid}" class="activity">
|
|
<div class="activity-title">Event: <textarea class="admin-textarea">${activityData[entry].title}</textarea></div>
|
|
<div class="activity-desc">Description: <textarea class="admin-textarea">${activityData[entry].desc}</textarea></div>
|
|
<div class="activity-where">Lieu: <textarea class="admin-textarea">${activityData[entry].where}</textarea></div>
|
|
<div class="activity-start">Début: <input type="datetime-local" class="admin-input-date" value="${toIsoString(new Date(activityData[entry].start))}"></input></div>
|
|
<div class="activity-end">Fin: <input type="datetime-local" class="admin-input-date" value="${toIsoString(new Date(activityData[entry].end))}"></input></div>
|
|
<span class="activity-footer">
|
|
<div class="activity-uid">UID: ${activityData[entry].activityUid}</div>
|
|
</span>
|
|
<span class="activity-btn">
|
|
<div class="activity-btn-update">Update</div>
|
|
<div class="activity-btn-delete">Supprimer</div>
|
|
</span>
|
|
</span>
|
|
`)
|
|
} else if (activityData[entry].type = "treasure") {
|
|
$("#admin-content").prepend(`
|
|
<span id="${activityData[entry].activityUid}" class="activity">
|
|
<div class="activity-title">Trésor: <textarea class="admin-textarea">${activityData[entry].title}</textarea></div>
|
|
<div class="activity-desc">Description: <textarea class="admin-textarea">${activityData[entry].desc}</textarea></div>
|
|
<div class="activity-where">Lieu: <textarea class="admin-textarea">${activityData[entry].where}</textarea></div>
|
|
<div class="activity-start">Début: <input type="datetime-local" class="admin-input-date" value="${toIsoString(new Date(activityData[entry].start))}"></input></div>
|
|
<div class="activity-state">Status: ${activityData[entry].treasureState}</div>
|
|
<span class="activity-footer">
|
|
<div class="activity-uid">UID: ${activityData[entry].activityUid}</div>
|
|
</span>
|
|
<span class="activity-btn">
|
|
<div class="activity-btn-update">Update</div>
|
|
<div class="activity-btn-delete">Supprimer</div>
|
|
</span>
|
|
</span>
|
|
`)
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
refreshListener();
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function refreshListener() {
|
|
$(".prank-btn-accept").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "acceptPrank",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
prankUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
let btnElems = $("#"+uid).children()[6];
|
|
btnElems.children()[0].css("display", "none");
|
|
btnElems.children()[2].css("display", "flex");
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
|
|
$(".prank-btn-refused").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "refusePrank",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
prankUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
$("#"+uid).remove();
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
|
|
$(".prank-btn-done").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "donePrank",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
prankUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
$("#"+uid).remove();
|
|
$("#prankDone")[0].innerHTML = "Nombre totale de mission achevées: " + (parseInt($("#prankDone")[0].innerHTML.replace("Nombre totale de mission achevées: ", "")) + 1);
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
|
|
$(".treasure-btn-accept").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "acceptTreasure",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
treasureUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
$("#"+uid).remove();
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
|
|
$(".treasure-btn-refused").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "refuseTreasure",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
treasureUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
$("#"+uid).remove();
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
$(".activity-btn-update").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id;
|
|
let children = e.target.parentNode.parentNode.children;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "addActivity",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
activityUid: uid,
|
|
type: (children[0].innerHTML.substring(0, 5) == "Event") ? "event" : "treasure",
|
|
title: children[0].children[0].value,
|
|
desc: children[1].children[0].value,
|
|
where: children[2].children[0].value,
|
|
start: new Date(children[3].children[0].value).toString(),
|
|
end: (children[3].children.length == 0) ? null : new Date(children[4].children[0].value).toString(),
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
alert("Update réussie")
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
$(".activity-btn-delete").click((e) => {
|
|
let uid = e.target.parentNode.parentNode.id
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "delActivity",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
activityUid: uid,
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
$("#"+uid).remove();
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
$("#activityType").on("change", function() {
|
|
if (this.value == "treasure") {
|
|
$("#activity-end-add").css("display", "none");
|
|
} else if (this.value == "event") {
|
|
$("#activity-end-add").css("display", "flex");
|
|
}
|
|
})
|
|
$("#activity-btn-add").click((e) => {
|
|
let children = e.target.parentNode.parentNode.children;
|
|
$.ajax({
|
|
type: "POST",
|
|
url: base_url + "addActivity",
|
|
data: JSON.stringify({
|
|
uid: localStorage.getItem('user'),
|
|
token: localStorage.getItem('token'),
|
|
type: $("#activityType").val(),
|
|
title: children[2].children[0].value,
|
|
desc: children[3].children[0].value,
|
|
where: children[4].children[0].value,
|
|
start: new Date(children[5].children[0].value).toString(),
|
|
end: ($("#activityType").val() == "treasure") ? null : new Date(children[6].children[0].value).toString(),
|
|
}),
|
|
contentType: "application/json; charset=utf-8",
|
|
dataType: "json",
|
|
|
|
success: function (data) {
|
|
if(data.success) {
|
|
get_admin("activity");
|
|
} else {
|
|
if (data.why == "Not authentificated") {
|
|
show_page('#login-page');
|
|
} else {
|
|
alert(data.why);
|
|
}
|
|
}
|
|
}
|
|
});
|
|
})
|
|
}
|
|
|
|
$(window).on("load", function() {
|
|
|
|
/* Register the Service Worker */
|
|
if ('serviceWorker' in navigator) {
|
|
navigator.serviceWorker.register('./js/sw.js');
|
|
}
|
|
|
|
for(i in page) {
|
|
$(page[i]).css('z-index', i);
|
|
}
|
|
|
|
/* load timer */
|
|
window.setInterval(function() {
|
|
var time = $("#timer").text();
|
|
var t = time.split(":").map(t => parseInt(t));
|
|
t[2] -= 1;
|
|
if (t[2] < 0) {
|
|
t[2] = 59;
|
|
t[1] -= 1;
|
|
}
|
|
if (t[1] < 0) {
|
|
t[1] = 59;
|
|
t[0] -= 1;
|
|
}
|
|
if (t[0] < 0) {
|
|
t[0] = 0;
|
|
t[1] = 0;
|
|
t[2] = 0;
|
|
}
|
|
$("#timer").text((new Date('December 17, 1995 ' + t.join(':'))).toLocaleTimeString('default', {
|
|
hour: '2-digit',
|
|
minute: '2-digit',
|
|
second: '2-digit'
|
|
}));
|
|
}, 1000);
|
|
});
|
|
|
|
function toIsoString(date) {
|
|
var tzo = -date.getTimezoneOffset(),
|
|
dif = tzo >= 0 ? '+' : '-',
|
|
pad = function(num) {
|
|
return (num < 10 ? '0' : '') + num;
|
|
};
|
|
|
|
return date.getFullYear() +
|
|
'-' + pad(date.getMonth() + 1) +
|
|
'-' + pad(date.getDate()) +
|
|
'T' + pad(date.getHours()) +
|
|
':' + pad(date.getMinutes()) +
|
|
':' + pad(date.getSeconds());
|
|
}
|