diff --git a/.gitignore b/.gitignore
index 3054b59..8c2c770 100644
--- a/.gitignore
+++ b/.gitignore
@@ -124,3 +124,4 @@ public/css
public/js
docker-compose.yml
dump
+data
diff --git a/README.md b/README.md
index bfc29e6..af9a072 100644
--- a/README.md
+++ b/README.md
@@ -4,7 +4,7 @@
MusicTopus est une application Web (que vous pouvez auto-héberger) et un site Web (sur lequel vous pouvez créer un compte) permettant de gérer votre liste des CDs et Vinyles et de l'utiliser facilement n'importe où.
-Le code source est publié sous licence libre [GNU GPL-3.0-or-later](LICENSE) et est disponible sur [git.darkou.fr](https://git.darkou.fr/dbroqua/MusicTopus).
+Le code source est publié sous licence libre [GNU GPL-3.0-or-later](LICENSE) et est disponible sur [forge.darkou.fr](https://forge.darkou.fr/contact/MusicTopus).
## Utilisation
@@ -33,7 +33,7 @@ En mode standalone il vous faudra :
Quelque que soit la méthode, la première étape est de cloner le projet :
```bash
-git clone https://git.darkou.fr/dbroqua/MusicTopus.git
+git clone https://forge.darkou.fr/contact/MusicTopus.git
```
### Installation
@@ -240,5 +240,5 @@ MAIL_TO # Adresse mail du contact qui recevra les messages de la page "nous cont
## Contributeurs
-- Damien Broqua (développeur principal du projet)
-- Brunus (Logo et fournisseur d'idées :wink: )
+- [DarKou](https://darkou.link/) (développeur principal du projet)
+- [Brunus](https://www.brunuslab.net/) (Logo et fournisseur d'idées 😉 )
diff --git a/docker-compose.yml.dev b/docker-compose.yml.dev
index 6b6a0d5..d33ff77 100644
--- a/docker-compose.yml.dev
+++ b/docker-compose.yml.dev
@@ -1,61 +1,62 @@
version: "2.4"
services:
- musictopus-www:
- container_name: musictopus-www
- image: "node:18"
- restart: always
- user: "node"
- working_dir: /home/node/app
- command: >
- bash -c "
- yarn install &&
- yarn watch"
- volumes:
- - ./:/home/node/app
- - /home/node/node_modules
- ports:
- - 3001:3001
- depends_on:
- - musictopus-db
- environment:
- NODE_ENV: ${NODE_ENV}
- PORT: ${PORT}
- MONGODB_URI: ${MONGODB_URI}
- SECRET: ${SECRET}
- DISCOGS_TOKEN: ${DISCOGS_TOKEN}
- FORMSPREE_ID: ${FORMSPREE_ID}
- MATOMO_URL: ${MATOMO_URL}
- MATOMO_ID: ${MATOMO_ID}
- SITE_NAME: ${SITE_NAME}
- AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
- AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
- S3_BASEFOLDER: ${S3_BASEFOLDER}
- S3_BUCKET: ${S3_BUCKET}
- S3_ENDPOINT: ${S3_ENDPOINT}
- S3_SIGNATURE: ${S3_SIGNATURE}
- JOBS_HEADER_KEY: ${JOBS_HEADER_KEY}
- JOBS_HEADER_VALUE: ${JOBS_HEADER_VALUE}
- REGISTRATION_OPEN: ${REGISTRATION_OPEN}
- MAIL_METHOD: ${MAIL_METHOD}
- MAIL_HOST: ${MAIL_HOST}
- MAIL_PORT: ${MAIL_PORT}
- MAIL_USER: ${MAIL_USER}
- MAIL_PASSWORD: ${MAIL_PASSWORD}
- MAIL_TO: ${MAIL_TO}
- networks:
- - musictopus
- musictopus-db:
- container_name: musictopus-db
- image: mongo:4.4
- restart: always
- ports:
- - 27617:27017
- networks:
- - musictopus
- volumes:
- - ./dump:/dump
+ musictopus-www:
+ container_name: musictopus-www
+ image: "node:18"
+ restart: always
+ user: "node"
+ working_dir: /home/node/app
+ command: >
+ bash -c "
+ yarn install &&
+ yarn watch"
+ volumes:
+ - ./:/home/node/app
+ - /home/node/node_modules
+ ports:
+ - 3001:3001
+ depends_on:
+ - musictopus-db
+ environment:
+ NODE_ENV: ${NODE_ENV}
+ PORT: ${PORT}
+ MONGODB_URI: ${MONGODB_URI}
+ SECRET: ${SECRET}
+ DISCOGS_TOKEN: ${DISCOGS_TOKEN}
+ FORMSPREE_ID: ${FORMSPREE_ID}
+ MATOMO_URL: ${MATOMO_URL}
+ MATOMO_ID: ${MATOMO_ID}
+ SITE_NAME: ${SITE_NAME}
+ AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
+ AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
+ S3_BASEFOLDER: ${S3_BASEFOLDER}
+ S3_BUCKET: ${S3_BUCKET}
+ S3_ENDPOINT: ${S3_ENDPOINT}
+ S3_SIGNATURE: ${S3_SIGNATURE}
+ JOBS_HEADER_KEY: ${JOBS_HEADER_KEY}
+ JOBS_HEADER_VALUE: ${JOBS_HEADER_VALUE}
+ REGISTRATION_OPEN: ${REGISTRATION_OPEN}
+ MAIL_METHOD: ${MAIL_METHOD}
+ MAIL_HOST: ${MAIL_HOST}
+ MAIL_PORT: ${MAIL_PORT}
+ MAIL_USER: ${MAIL_USER}
+ MAIL_PASSWORD: ${MAIL_PASSWORD}
+ MAIL_TO: ${MAIL_TO}
+ networks:
+ - musictopus
+ musictopus-db:
+ container_name: musictopus-db
+ image: mongo:4.4
+ restart: always
+ ports:
+ - 27617:27017
+ networks:
+ - musictopus
+ volumes:
+ - ./dump:/dump
+ - ./data:/data/db
networks:
- musictopus:
- driver: bridge
+ musictopus:
+ driver: bridge
diff --git a/fontello.json b/fontello.json
index 11e03d9..efb7b52 100644
--- a/fontello.json
+++ b/fontello.json
@@ -6,6 +6,12 @@
"units_per_em": 1000,
"ascent": 850,
"glyphs": [
+ {
+ "uid": "ca90da02d2c6a3183f2458e4dc416285",
+ "css": "adjust",
+ "code": 59408,
+ "src": "fontawesome"
+ },
{
"uid": "44e04715aecbca7f266a17d5a7863c68",
"css": "plus",
diff --git a/gulpfile.js b/gulpfile.js
index 8e76f38..fe1fe6f 100644
--- a/gulpfile.js
+++ b/gulpfile.js
@@ -10,6 +10,7 @@ const babel = require("gulp-babel");
const sourceJs = "javascripts/**/*.js";
const sourceRemoteJS = [
"./node_modules/vue/dist/vue.global.prod.js",
+ "./node_modules/chart.js/dist/chart.umd.js",
"./node_modules/axios/dist/axios.min.js",
];
diff --git a/javascripts/ajouter-un-album.js b/javascripts/ajouter-un-album.js
index 02f50d4..3bce60c 100644
--- a/javascripts/ajouter-un-album.js
+++ b/javascripts/ajouter-un-album.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -78,6 +79,12 @@ Vue.createApp({
],
};
},
+ created() {
+ window.addEventListener("keydown", this.keyDown);
+ },
+ destroyed() {
+ window.removeEventListener("keydown", this.keyDown);
+ },
methods: {
search(event) {
event.preventDefault();
@@ -171,12 +178,15 @@ Vue.createApp({
this.submitting = true;
return axios
- .post("/api/v1/albums", {
+ .post(`/api/v1/${action}`, {
album: this.details,
share: this.share,
})
.then(() => {
- window.location.href = "/ma-collection";
+ window.location.href =
+ action === "albums"
+ ? "/ma-collection"
+ : "/ma-liste-de-souhaits";
})
.catch((err) => {
this.submitting = false;
@@ -189,5 +199,13 @@ Vue.createApp({
orderedItems(items) {
return items.sort();
},
+ keyDown(event) {
+ const keycode = event.code;
+
+ if (this.modalIsVisible && keycode === "Escape") {
+ event.preventDefault();
+ this.modalIsVisible = false;
+ }
+ },
},
}).mount("#ajouter-album");
diff --git a/javascripts/collection.js b/javascripts/collection.js
index 21ff703..9e222d2 100644
--- a/javascripts/collection.js
+++ b/javascripts/collection.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -7,8 +8,8 @@ Vue.createApp({
total: 0,
// eslint-disable-next-line no-undef
page: query.page || 1,
- totalPages: 1,
limit: 16,
+ totalPages: 1,
artist: "",
format: "",
year: "",
@@ -34,10 +35,18 @@ Vue.createApp({
},
created() {
this.fetch();
+
+ window.addEventListener("keydown", this.keyDown);
+ },
+ destroyed() {
+ window.removeEventListener("keydown", this.keyDown);
},
methods: {
formatParams(param) {
- return param.replace("&", "%26").replace("+", "%2B");
+ return param
+ .replace("&", "%26")
+ .replace("+", "%2B")
+ .replace('"', "%22");
},
fetch() {
this.loading = true;
@@ -57,7 +66,7 @@ Vue.createApp({
const [key, value] = entry;
switch (key) {
case "artists_sort":
- this.artist = value;
+ this.artist = value.replaceAll('"', "%22");
break;
default:
if (["order", "sort"].indexOf(key) !== -1) {
@@ -69,7 +78,7 @@ Vue.createApp({
this.sortOrder = `${sortOrder.sort}-${sortOrder.order}`;
- let url = `/api/v1/albums?page=${this.page}&limit=${this.limit}&sort=${this.sort}&order=${this.order}`;
+ let url = `/api/v1/${action}?page=${this.page}&sort=${this.sort}&order=${this.order}`;
if (this.artist) {
url += `&artist=${this.formatParams(this.artist)}`;
}
@@ -94,6 +103,7 @@ Vue.createApp({
.get(url)
.then((response) => {
this.items = response.data.rows;
+ this.limit = response.data.limit;
this.total = response.data.count || 0;
this.totalPages =
parseInt(response.data.count / this.limit, 10) +
@@ -180,7 +190,7 @@ Vue.createApp({
return false;
}
return axios
- .delete(`/api/v1/albums/${this.itemId}`)
+ .delete(`/api/v1/${action}/${this.itemId}`)
.then(() => {
this.fetch();
})
@@ -240,5 +250,16 @@ Vue.createApp({
return render;
},
+ keyDown(event) {
+ const keycode = event.code;
+ if (this.showModalDelete && keycode === "Escape") {
+ event.preventDefault();
+ this.showModalDelete = false;
+ }
+ if (this.showModalShare && keycode === "Escape") {
+ event.preventDefault();
+ this.showModalShare = false;
+ }
+ },
},
}).mount("#collection");
diff --git a/javascripts/mon-compte/index.js b/javascripts/mon-compte/index.js
index 2fb6f0f..464c8b6 100644
--- a/javascripts/mon-compte/index.js
+++ b/javascripts/mon-compte/index.js
@@ -1,4 +1,3 @@
-
if (typeof email !== "undefined" && typeof username !== "undefined") {
Vue.createApp({
data() {
@@ -12,15 +11,21 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
password: "",
passwordConfirm: "",
// eslint-disable-next-line no-undef
+ pagination,
+ // eslint-disable-next-line no-undef
mastodon: mastodon || {
publish: false,
url: "",
token: "",
message:
"Je viens d'ajouter {artist} - {album} à ma collection !",
+ wantlist:
+ "Je viens d'ajouter {artist} - {album} à ma liste de souhaits !",
},
+ delete: false,
},
loading: false,
+ deleting: false,
errors: [],
};
},
@@ -57,8 +62,13 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
// eslint-disable-next-line no-unused-vars
async updateProfil() {
this.errors = [];
- const { oldPassword, password, passwordConfirm, mastodon } =
- this.formData;
+ const {
+ oldPassword,
+ password,
+ passwordConfirm,
+ mastodon,
+ pagination,
+ } = this.formData;
if (password && !oldPassword) {
this.errors.push("emptyPassword");
@@ -83,6 +93,8 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
data.oldPassword = oldPassword;
}
+ data.pagination = pagination;
+
try {
await axios.patch(`/api/v1/me`, data);
@@ -98,6 +110,20 @@ if (typeof email !== "undefined" && typeof username !== "undefined") {
return true;
},
+ async deleteAccount() {
+ try {
+ await axios.delete(`/api/v1/me`);
+
+ showToastr("Compte supprimé", true);
+
+ window.location.href = "/se-deconnecter";
+ } catch (err) {
+ showToastr(
+ err.response?.data?.message ||
+ "Impossible de mettre à jour votre profil"
+ );
+ }
+ },
},
}).mount("#mon-compte");
}
diff --git a/javascripts/mon-compte/ma-collection/details.js b/javascripts/mon-compte/ma-collection/details.js
index af0414f..2297bdd 100644
--- a/javascripts/mon-compte/ma-collection/details.js
+++ b/javascripts/mon-compte/ma-collection/details.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
if (typeof item !== "undefined") {
Vue.createApp({
data() {
@@ -25,10 +26,10 @@ if (typeof item !== "undefined") {
this.setTrackList();
this.setIdentifiers();
- window.addEventListener("keydown", this.changeImage);
+ window.addEventListener("keydown", this.keyDown);
},
destroyed() {
- window.removeEventListener("keydown", this.changeImage);
+ window.removeEventListener("keydown", this.keyDown);
},
watch: {
shareMessage(message) {
@@ -40,6 +41,8 @@ if (typeof item !== "undefined") {
this.shareMessageTransformed = message
.replaceAll("{artist}", this.item.artists[0].name)
.replaceAll("{format}", this.item.formats[0].name)
+ .replaceAll("{genres}", this.item.genres.join(", "))
+ .replaceAll("{styles}", this.item.styles.join(", "))
.replaceAll("{year}", this.item.year)
.replaceAll("{video}", video)
.replaceAll("{album}", this.item.title);
@@ -139,12 +142,12 @@ if (typeof item !== "undefined") {
this.setImage();
},
changeImage(event) {
+ event.preventDefault();
const direction = event.code;
if (
- this.modalIsVisible &&
["ArrowRight", "ArrowLeft", "Escape"].indexOf(direction) !==
- -1
+ -1
) {
switch (direction) {
case "ArrowRight":
@@ -159,6 +162,20 @@ if (typeof item !== "undefined") {
return true;
},
+ keyDown(event) {
+ const keycode = event.code;
+ if (this.modalIsVisible) {
+ this.changeImage(event);
+ }
+ if (this.showModalDelete && keycode === "Escape") {
+ event.preventDefault();
+ this.showModalDelete = false;
+ }
+ if (this.showModalShare && keycode === "Escape") {
+ event.preventDefault();
+ this.showModalShare = false;
+ }
+ },
showAllIdentifiers() {
this.identifiersMode = "all";
this.setIdentifiers();
@@ -180,7 +197,7 @@ if (typeof item !== "undefined") {
updateItem() {
showToastr("Mise à jour en cours…", true);
axios
- .patch(`/api/v1/albums/${this.item._id}`)
+ .patch(`/api/v1/${action}/${this.item._id}`)
.then((res) => {
showToastr("Mise à jour réalisée avec succès", true);
this.item = res.data;
@@ -199,9 +216,12 @@ if (typeof item !== "undefined") {
},
deleteItem() {
axios
- .delete(`/api/v1/albums/${this.item._id}`)
+ .delete(`/api/v1/${action}/${this.item._id}`)
.then(() => {
- window.location.href = "/ma-collection";
+ window.location.href =
+ action === "albums"
+ ? "/ma-collection"
+ : "/ma-liste-de-souhaits";
})
.catch((err) => {
showToastr(
@@ -222,7 +242,7 @@ if (typeof item !== "undefined") {
}
this.shareSubmiting = true;
axios
- .post(`/api/v1/albums/${this.item._id}/share`, {
+ .post(`/api/v1/${action}/${this.item._id}/share`, {
message: this.shareMessageTransformed,
})
.then(() => {
diff --git a/javascripts/mon-compte/ma-collection/exporter.js b/javascripts/mon-compte/ma-collection/exporter.js
index b391436..90ef809 100644
--- a/javascripts/mon-compte/ma-collection/exporter.js
+++ b/javascripts/mon-compte/ma-collection/exporter.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -10,7 +11,10 @@ Vue.createApp({
exportCollection(event) {
event.preventDefault();
- window.open(`/api/v1/albums?exportFormat=${this.format}`, "_blank");
+ window.open(
+ `/api/v1/${action}?exportFormat=${this.format}`,
+ "_blank"
+ );
},
},
}).mount("#exporter");
diff --git a/javascripts/mon-compte/ma-collection/importer.js b/javascripts/mon-compte/ma-collection/importer.js
index 08f2b6f..6103bfa 100644
--- a/javascripts/mon-compte/ma-collection/importer.js
+++ b/javascripts/mon-compte/ma-collection/importer.js
@@ -1,3 +1,4 @@
+/* eslint-disable no-undef */
Vue.createApp({
data() {
return {
@@ -66,11 +67,11 @@ Vue.createApp({
try {
const res = await axios.get(
- `/api/v1/albums?discogsId=${release_id}`
+ `/api/v1/${action}?discogsId=${release_id}`
);
if (res.status === 204) {
- await axios.post("/api/v1/albums", {
+ await axios.post(`/api/v1/${action}`, {
discogsId: release_id,
share: false,
});
diff --git a/javascripts/theme.js b/javascripts/theme.js
index 4625673..e39836b 100644
--- a/javascripts/theme.js
+++ b/javascripts/theme.js
@@ -1,19 +1,3 @@
-/**
- * Fonction permettant de sauvegarder dans le stockage local le choix du thème
- * @param {String} scheme
- */
-function saveColorScheme(scheme) {
- localStorage.setItem("theme", scheme);
-}
-
-/**
- * Fonction permettant de changer le thème du site
- * @param {String} scheme
- */
-function setColorScheme(scheme) {
- document.documentElement.setAttribute("data-theme", scheme);
-}
-
/**
* Fonction permettant de récupérer le thème du système
* @return {String}
@@ -28,10 +12,56 @@ function getPreferredColorScheme() {
return "light";
}
+/**
+ * @param {String} scheme
+ */
+function setPictoOnMenu(scheme) {
+ document.querySelectorAll(".icon-theme").forEach((item) => {
+ item.classList.add("hidden");
+ });
+ document
+ .querySelector(`.icon-theme.theme-${scheme}`)
+ .classList.remove("hidden");
+}
+
+/**
+ * Fonction permettant de sauvegarder dans le stockage local le choix du thème
+ * @param {String} scheme
+ */
+function saveColorScheme(scheme) {
+ localStorage.setItem("theme", scheme);
+}
+
+/**
+ * Fonction permettant de changer le thème du site
+ * @param {String} scheme
+ */
+function setColorScheme(scheme) {
+ document.documentElement.setAttribute(
+ "data-theme",
+ scheme === "system" ? getPreferredColorScheme() : scheme
+ );
+
+ setPictoOnMenu(scheme);
+}
+
+/**
+ * Fonction déclenchée lorsqu'un utilisateur clique sur un bouton dans le menu déroulant
+ * @param {Object} e
+ */
+function changeTheme(e) {
+ e.preventDefault();
+
+ const scheme = this.dataset.value;
+
+ saveColorScheme(scheme);
+ setColorScheme(scheme);
+}
+
// INFO: On place un event sur le bouton
-const toggleSwitch = document.querySelector(
- '.theme-switch input[type="checkbox"]'
-);
+const buttonsTheme = document.getElementsByClassName("theme");
+// INFO: On récupère du local storage (ou des préférences navigateur) le thème actuel
+const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme();
/**
* Event permettant de détecter les changements de thème du système
@@ -44,28 +74,14 @@ if (window.matchMedia) {
if (selectedColorScheme === "system") {
const preferedColorScheme = getPreferredColorScheme();
setColorScheme(preferedColorScheme);
-
- toggleSwitch.checked = preferedColorScheme === "dark";
}
});
}
-const currentTheme = localStorage.getItem("theme") || getPreferredColorScheme();
-
// INFO: Au chargement de la page on détecte le thème à charger
setColorScheme(currentTheme);
-toggleSwitch.checked = currentTheme === "dark";
-
-toggleSwitch.addEventListener(
- "change",
- (e) => {
- e.preventDefault();
-
- const scheme = e.target.checked ? "dark" : "light";
-
- saveColorScheme(scheme);
- setColorScheme(scheme);
- },
- false
-);
+// INFO: On place un event au click sur chacun des boutons du menu
+for (let i = 0; i < buttonsTheme.length; i += 1) {
+ buttonsTheme[i].addEventListener("click", changeTheme, false);
+}
diff --git a/package-lock.json b/package-lock.json
index 1a49ca9..64fdc92 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -15,6 +15,7 @@
"@babel/core": "^7.17.2",
"@babel/preset-env": "^7.16.11",
"axios": "^0.26.0",
+ "chart.js": "^4.4.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
"connect-mongo": "^4.6.0",
@@ -5257,6 +5258,11 @@
"integrity": "sha512-XPSJHWmi394fuUuzDnGz1wiKqWfo1yXecHQMRf2l6hztTO+nPru658AyDngaBe7isIxEkRsPR3FZh+s7iVa4Uw==",
"license": "MIT"
},
+ "node_modules/@kurkle/color": {
+ "version": "0.3.2",
+ "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz",
+ "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw=="
+ },
"node_modules/@mongodb-js/saslprep": {
"version": "1.1.4",
"resolved": "https://registry.npmjs.org/@mongodb-js/saslprep/-/saslprep-1.1.4.tgz",
@@ -7913,6 +7919,17 @@
"node": ">=4"
}
},
+ "node_modules/chart.js": {
+ "version": "4.4.1",
+ "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.1.tgz",
+ "integrity": "sha512-C74QN1bxwV1v2PEujhmKjOZ7iUM4w6BWs23Md/6aOZZSlwMzeCIDGuZay++rBgChYru7/+QFeoQW0fQoP534Dg==",
+ "dependencies": {
+ "@kurkle/color": "^0.3.0"
+ },
+ "engines": {
+ "pnpm": ">=7"
+ }
+ },
"node_modules/chokidar": {
"version": "3.5.3",
"resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz",
diff --git a/package.json b/package.json
index e8815fb..b9cba5b 100644
--- a/package.json
+++ b/package.json
@@ -19,7 +19,7 @@
},
"repository": {
"type": "git",
- "url": "git@git.darkou.fr:dbroqua/MusicTopus.git"
+ "url": "git@forge.darkou.fr:contact/MusicTopus.git"
},
"author": {
"name": "Damien Broqua",
@@ -45,6 +45,7 @@
"@babel/core": "^7.17.2",
"@babel/preset-env": "^7.16.11",
"axios": "^0.26.0",
+ "chart.js": "^4.4.1",
"connect-ensure-login": "^0.1.1",
"connect-flash": "^0.1.1",
"connect-mongo": "^4.6.0",
diff --git a/public/500.html b/public/500.html
index 76eb123..0de99d6 100644
--- a/public/500.html
+++ b/public/500.html
@@ -17,7 +17,7 @@
-
+
Nous sommes désolé mais quelque chose a mal tourné de notre côté.
diff --git a/public/font/icon.eot b/public/font/icon.eot
index 424368f..20368e4 100644
Binary files a/public/font/icon.eot and b/public/font/icon.eot differ
diff --git a/public/font/icon.svg b/public/font/icon.svg
index 52ad914..04a06e1 100644
--- a/public/font/icon.svg
+++ b/public/font/icon.svg
@@ -1,7 +1,7 @@