From aeb5df067c77692a7c529834a2761e6003313f88 Mon Sep 17 00:00:00 2001 From: Damien Broqua Date: Sun, 6 Mar 2022 14:38:26 +0100 Subject: [PATCH] issue/1 (#31) Co-authored-by: dbroqua Reviewed-on: https://git.darkou.fr/dbroqua/MusicTopus/pulls/31 --- package.json | 13 +- public/font/icon.eot | Bin 9408 -> 9976 bytes public/font/icon.svg | 2 + public/font/icon.ttf | Bin 9256 -> 9824 bytes public/font/icon.woff | Bin 5844 -> 6224 bytes public/font/icon.woff2 | Bin 4860 -> 5208 bytes public/js/main.js | 7 +- sass/{ma-collection.scss => collection.scss} | 7 +- sass/colors.scss | 17 ++ sass/composants.scss | 13 + sass/global.scss | 4 + sass/icons.scss | 1 + sass/index.scss | 5 +- sass/toast.scss | 5 + src/app.js | 9 +- src/libs/error.js | 4 +- src/middleware/Albums.js | 66 ++++- src/middleware/Me.js | 45 +++ src/models/users.js | 16 +- src/routes/api/v1/albums.js | 2 +- src/routes/api/v1/me.js | 24 ++ src/routes/collection.js | 22 ++ src/routes/ma-collection.js | 2 +- views/error.ejs | 2 + .../ma-collection.ejs => collection.ejs} | 57 +--- views/pages/composants.ejs | 90 +++++- .../mon-compte/ma-collection/exporter.ejs | 4 +- .../pages/mon-compte/ma-collection/index.ejs | 279 ++++++++++++++++++ 28 files changed, 630 insertions(+), 66 deletions(-) rename sass/{ma-collection.scss => collection.scss} (90%) create mode 100644 sass/composants.scss create mode 100644 src/middleware/Me.js create mode 100644 src/routes/api/v1/me.js create mode 100644 src/routes/collection.js rename views/pages/{mon-compte/ma-collection.ejs => collection.ejs} (78%) create mode 100644 views/pages/mon-compte/ma-collection/index.ejs diff --git a/package.json b/package.json index 8c53d5a..b5aea27 100644 --- a/package.json +++ b/package.json @@ -27,9 +27,6 @@ }, "license": "GPL-3.0-or-later", "devDependencies": { - "@babel/cli": "^7.17.0", - "@babel/core": "^7.17.2", - "@babel/preset-env": "^7.16.11", "eslint": "^8.9.0", "eslint-config-airbnb-base": "^15.0.0", "eslint-config-prettier": "^8.3.0", @@ -38,11 +35,12 @@ "husky": "^7.0.4", "lint-staged": "^12.3.3", "nodemon": "^2.0.15", - "npm-run-all": "^4.1.5", - "prettier": "^2.5.1", - "rimraf": "^3.0.2" + "prettier": "^2.5.1" }, "dependencies": { + "@babel/cli": "^7.17.0", + "@babel/core": "^7.17.2", + "@babel/preset-env": "^7.16.11", "axios": "^0.26.0", "connect-ensure-login": "^0.1.1", "connect-flash": "^0.1.1", @@ -54,14 +52,17 @@ "excel4node": "^1.7.2", "express": "^4.17.2", "express-session": "^1.17.2", + "joi": "^17.6.0", "knacss": "^8.0.4", "moment": "^2.29.1", "moment-timezone": "^0.5.34", "mongoose": "^6.2.1", "mongoose-unique-validator": "^3.0.0", + "npm-run-all": "^4.1.5", "passport": "^0.5.2", "passport-http": "^0.3.0", "passport-local": "^1.0.0", + "rimraf": "^3.0.2", "sass": "^1.49.7", "vue": "^3.2.31" }, diff --git a/public/font/icon.eot b/public/font/icon.eot index 8664abe7c3bb927c5503dbfc1ac1e0ec80045291..a17c0f6c12920aacff321df497143f171c000437 100644 GIT binary patch delta 1165 zcmYLITTEP46y5utd(W8{bD7I4xO1iNjperi@L3>rG9F2;{QlGT#BTsdmnJV{8c3(l z^C?Zv>0~TE(Q)r};$ISV#3Jb=>6OIaCu@n#Uz~n%tS$y1`vFwH8I4TUuZ{l&P<5Wx zLnaBr&nAe!N4(jLXBK;xUMk!r;Tsa3nomqd8b3a|0^pX3`{I$sBz8G(5N{{mun>ty zbBp`Oi4W5S*OQ5K#y|GhH2|G*Kt7p@CYNsZ+ypRw%&p(lT?VLR z56YlR!2Ws};L2~vzw%`Xpm2|Uz@CRzI15ko^@9a1S&$X3$ovv;rf{}IwU7i#Gax{b zg%T^)fSm=#;2b&d%nQ$r3>ijkSE~`Q@}q57?dDC5USF3h7zzhEb>S9V@HX^v;d1Mq z#?H`542DDDkY2Scc$2rqcM_Ytf_rooy$@ptYYFy>aG;A~0-g1!yO}mVaOfWxA0Jp1 z4piIf6}i_4VyGE!8$ny8YVo|YWmARFM>qTWk4P25syKK4~~tTl6kBVSi=6fWzD&Zmz)=nr z$#NS~YFXq6RqMFs;6!Sy!m)ZN_c3kSn3R2pB9O5h3mx`Mq}hrGqx zB6PR#grrZ-nC82)*p0UWr-w{)=yc!~n%AbK*}*5tBNaWfS7&Djg=5N3j(^G_&Y05t z+B}l$Br$KO-%7Q23Y#nE)DwS$%65va_uF8_XZP(@EsR?35v{fOX4y_*w-{2wXyK5J z0_2ifU5)IJQ}TiGrn1d@`JbZrT#Ii=%YUf-Or4!us&0@`!>Zi%>K;FjE+!MHjGRu+ qELi4e7Uqse7c(sV>Vh0kBo>sk8A(NzOe&H#l?hs&%KuaSgY#cdItO3? delta 634 zcmXv~OK1~O6g~6FB|_@iQ!I^&4J$)7Y**_l&+pO7z-swur- z>jCmKvoDo-oE$ipXTPihJ)`M_J{x&H^cDzSVtqJG!FyVoCVxgAOJ|Fvk@Br>lfoMc z6PbKm@9R4{MgEigcvdeN!WsW2a9Adf=JagBEVYNo`3kXWRY=Zikoh1Vxds_Y>VEhjLTUIKW36Rt$?CML-7e68 z!^`{J@o*=BJ;$68MU;}jeu-`#DDcwl0R0a^MGyCByt<&6mbkYnc{P3v!@jK@nz<+C zC&zdeVc)5>?1J5}$}Z>wYsm#2VRc;48||tKXtmGs52f}?eJ|A}gCE5H_2yROzIOf( zG^t@9wR`!YXFr?$p%Ecq-VB|*(CD`8x`W%@e^QWZ!ig)W;Jc6!uZa~&mPVzV^i{qi w?|LqJek-rI!~WGktseR&((GMt)U5Z8n`$_$7U%Rr+B1`RkefyAZ1|)9KOAYD0RR91 diff --git a/public/font/icon.svg b/public/font/icon.svg index 51f7015..d5ac2f6 100644 --- a/public/font/icon.svg +++ b/public/font/icon.svg @@ -34,6 +34,8 @@ + + diff --git a/public/font/icon.ttf b/public/font/icon.ttf index 1f0de7e581f6d9e5e42b4de9768222fc8c0c1ce2..4ccfa6dc9101474be2e0317776cd1611e5a2667a 100644 GIT binary patch delta 1160 zcmYLIZA@EL7=GV-?med;m)?GH+bN%gmLZ4@Ep3nu8MrwHQ|H$NV@H9)9fQ#nGMO=S zCU!qaBxudzAC{Rcx)^`VG+RtGF;V~Q-+mZk;uk;EG{!_qV$%JgzPEMpo;>Hg&vV}U zoR7Tc*2&%Rt+wpj0QfurOwBAM(;L5j{|)im0MeD2ORFuU)91TIontONzck(R;7#IR z5LM@sD{0c5#Bb1OnP0p-_wr=ZJb)Yq(85M4IorII_#418Me{L(1QBM_#6Kk7ZY-^? z4X(dZ`HO_FNI1E;Jdvsq40tCN%ulyQb&cB4q*_(hg32+@)HR`6(MrXVUGGs`1Qeyx` zYq5WCvvjqzTPp8wS1P1HRmuIYRDB+HNdE<@tsTrpmLQRn3<_`%U;!(wV|RiIb>IMv z(p{9p^Jk=TeoC@yYSrnd|NLC}SK0FGR&yhy&<2bBHGmypZ?gvSf>N#qa)r{>8pt0? zyEV{CP%76zYr_6^4d5!M^3Oag0aPBakJt;)31{K>&@fogk^@=cip;M7X9{QQ=2-+v z=jj}ZER=ckhS*tP49-yi&%Jo&^jI+1(AOD^Sb1X?)_ZwdYarC;ipJuRUR`(v7rYAt zT)4ctueCRJ6r=H2Jf?fHg0}@aLPxPJAh=K0Fz^KSu#V`Uh)4P;C(_%Dx|g{VBM0G; zL}Fx9sHk-{EAn74im`UQAB@_Zn#K3dj!hFnpSUwLd`PMjRz>A4emBahyZ!Lc_}svR zE`-CrW5>s~OdGsEoIsUp>`BcdMS}<7s@ofOML4WBwC&iL)qi31^p|xUh0A)R_u0lr z!_l7Z!wrvEqzis4v+vlN3cuSvV_B-E%I9p7sSt#xhmJLSB!#uxBnhmD5*r7Z$vI#O z%TXODIc^q34kVOvfOrX^so{{{?X0saG6XRwxZZ`mx|at+@o2n*t|kB_ZJpMg*qFiAUvyz zQ--v-wTKitNG!bT_*!cCt#W7MoOa|N&{)wdy17iRK14BY`Zeqc#MLP3<{0$5YOfku2B?>@sAP_A85`1X|>A6XI zKdXTJ1|XLwJ+T-hE&$|b0BMf&oXRu}t9+n-79Iu$UW<&>#1#2%-K7i+f-XRLvkagB zy8&|okY5Ajt7PPsRG7Dh{eJ@#SO64o$jMJml#&vQ0rDRJ`AWHo6$OmOd>a@Tgjj%l zg}lVv)X5c}bb)*opabU?;$h?jxd8HThrs{{WH)62)?l)rs{T+Z>=4 zP?!j8HWInb1k}SPt}xk1+**aDxF9o+BPTO2TQ{|$gt@phk0m!hKaaJfD6u$$H3=w@ L!mxR+_+dT(LNb`{ diff --git a/public/font/icon.woff b/public/font/icon.woff index 6474d86873d5600e7ce9e3cfcd9dd17133cfb3d1..32621989e6e774018e5a3e688d923ab43ac1a6f8 100644 GIT binary patch delta 3695 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 diff --git a/public/font/icon.woff2 b/public/font/icon.woff2 index 72207f36852f065f781663c05bf57befdcce483f..f73baf47585f0d4dc4df930369809d57ee27d3b2 100644 GIT binary patch literal 5208 zcmV-e6sPNVPew8T0RR9102EjN4*&oF0487n02BcL0RR9100000000000000000000 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 SOZR}g=t0ffALdsEwoCy}C+chf literal 4860 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 diff --git a/public/js/main.js b/public/js/main.js index 994b2ae..895683a 100644 --- a/public/js/main.js +++ b/public/js/main.js @@ -2,13 +2,16 @@ * Fonction permettant d'afficher un message dans un toastr * @param {String} message */ - function showToastr(message) { + function showToastr(message, success = false) { let x = document.getElementById("toastr"); if ( message ) { x.getElementsByTagName("SPAN")[0].innerHTML = message; } - x.className = `${x.className} show`; + x.className = `${x.className} show`.replace("sucess", ""); + if ( success ) { + x.className = `${x.className} success`; + } setTimeout(function(){ x.className = x.className.replace("show", ""); }, 3000); }; diff --git a/sass/ma-collection.scss b/sass/collection.scss similarity index 90% rename from sass/ma-collection.scss rename to sass/collection.scss index af22f2a..6412fe1 100644 --- a/sass/ma-collection.scss +++ b/sass/collection.scss @@ -1,4 +1,9 @@ -.ma-collection { +.collection { + h1 { + i { + cursor: pointer; + } + } .filters { display: flex; justify-content: end; diff --git a/sass/colors.scss b/sass/colors.scss index 5759f90..f100c6b 100644 --- a/sass/colors.scss +++ b/sass/colors.scss @@ -52,6 +52,23 @@ $pagination-hover-color: rgb(115, 151, 186); --box-shadow-color: #{rgba($nord4, 0.35)}; --border-color: #{$nord4}; + + --nord0: #{$nord0}; + --nord1: #{$nord1}; + --nord2: #{$nord2}; + --nord3: #{$nord3}; + --nord4: #{$nord4}; + --nord5: #{$nord5}; + --nord6: #{$nord6}; + --nord7: #{$nord7}; + --nord8: #{$nord8}; + --nord9: #{$nord9}; + --nord10: #{$nord10}; + --nord11: #{$nord11}; + --nord12: #{$nord12}; + --nord13: #{$nord13}; + --nord14: #{$nord14}; + --nord15: #{$nord15}; } [data-theme="dark"] { diff --git a/sass/composants.scss b/sass/composants.scss new file mode 100644 index 0000000..b9d4e65 --- /dev/null +++ b/sass/composants.scss @@ -0,0 +1,13 @@ +.composants { + .couleur { + margin-bottom: 1rem; + text-align: center; + + border: 1px solid var(--input-active-color); + box-shadow: var(--box-shadow-color) 0px 3px 6px 0px; + + div { + height: 56px; + } + } +} \ No newline at end of file diff --git a/sass/global.scss b/sass/global.scss index 491b9ca..454cd14 100644 --- a/sass/global.scss +++ b/sass/global.scss @@ -82,4 +82,8 @@ html { @include respond-to("small-up") { display: initial; } +} + +.is-danger { + color: $nord12; } \ No newline at end of file diff --git a/sass/icons.scss b/sass/icons.scss index 70ce584..4250307 100644 --- a/sass/icons.scss +++ b/sass/icons.scss @@ -46,6 +46,7 @@ .icon-link-ext:before { content: '\f08e'; } /* '' */ .icon-sun:before { content: '\f185'; } /* '' */ .icon-moon:before { content: '\f186'; } /* '' */ +.icon-share:before { content: '\f1e0'; } /* '' */ .icon-trash:before { content: '\f1f8'; } /* '' */ .icon-blind:before { content: '\f29d'; } /* '' */ diff --git a/sass/index.scss b/sass/index.scss index aa7557a..c54fc3c 100644 --- a/sass/index.scss +++ b/sass/index.scss @@ -43,5 +43,6 @@ @import './error'; @import './home'; @import './ajouter-un-album'; -@import './ma-collection'; -@import './ma-collection-details'; \ No newline at end of file +@import './collection'; +@import './ma-collection-details'; +@import './composants'; \ No newline at end of file diff --git a/sass/toast.scss b/sass/toast.scss index 21d1730..46777e7 100644 --- a/sass/toast.scss +++ b/sass/toast.scss @@ -13,6 +13,11 @@ color: $button-alternate-color; border-radius: 6px; + &.success { + background-color: $success-color; + color: $button-font-color; + } + &.show { visibility: visible; animation: toastrFadein 0.5s, toastrFadeout 0.5s 2.5s; diff --git a/src/app.js b/src/app.js index 0b32d82..6d1e507 100644 --- a/src/app.js +++ b/src/app.js @@ -13,9 +13,11 @@ import { isXhr } from "./helpers"; import indexRouter from "./routes"; import maCollectionRouter from "./routes/ma-collection"; +import collectionRouter from "./routes/collection"; import importAlbumRouterApiV1 from "./routes/api/v1/albums"; import importSearchRouterApiV1 from "./routes/api/v1/search"; +import importMeRouterApiV1 from "./routes/api/v1/me"; // Mongoose schema init require("./models/users"); @@ -82,8 +84,10 @@ app.use( app.use("/", indexRouter); app.use("/ma-collection", maCollectionRouter); +app.use("/collection", collectionRouter); app.use("/api/v1/albums", importAlbumRouterApiV1); app.use("/api/v1/search", importSearchRouterApiV1); +app.use("/api/v1/me", importMeRouterApiV1); // Handle 404 app.use((req, res) => { @@ -113,7 +117,10 @@ app.use((error, req, res, next) => { } else { res.status(error.errorCode || 500); res.render("index", { - page: { title: "500: Oups… le serveur a crashé !", error }, + page: { + title: error.title || "500: Oups… le serveur a crashé !", + error, + }, errorCode: error.errorCode || 500, viewname: "error", user: req.user || null, diff --git a/src/libs/error.js b/src/libs/error.js index 562265f..13470f2 100644 --- a/src/libs/error.js +++ b/src/libs/error.js @@ -4,9 +4,10 @@ class ErrorEvent extends Error { /** * @param {Number} errorCode + * @param {String} title * @param {Mixed} ...params */ - constructor(errorCode, ...params) { + constructor(errorCode, title, ...params) { super(...params); if (Error.captureStackTrace) { @@ -14,6 +15,7 @@ class ErrorEvent extends Error { } this.errorCode = parseInt(errorCode, 10); + this.title = title; this.date = new Date(); } } diff --git a/src/middleware/Albums.js b/src/middleware/Albums.js index 4796207..8025973 100644 --- a/src/middleware/Albums.js +++ b/src/middleware/Albums.js @@ -5,12 +5,19 @@ import xl from "excel4node"; import Pages from "./Pages"; import AlbumsModel from "../models/albums"; +import UsersModel from "../models/users"; import ErrorEvent from "../libs/error"; /** * Classe permettant la gestion des albums d'un utilisateur */ class Albums extends Pages { + /** + * Méthode permettant de remplacer certains cartactères par leur équivalents html + * @param {String} str + * + * @return {String} + */ static replaceSpecialChars(str) { if (!str) { return ""; @@ -487,7 +494,7 @@ class Albums extends Pages { static async getAllDistincts(field, user) { const distincts = await AlbumsModel.find( { - user, + User: user, }, [], { @@ -513,8 +520,11 @@ class Albums extends Pages { order = "asc", artists_sort, format, + userId: collectionUserId, } = this.req.query; + let userId = this.req.user?._id; + const where = {}; if (artists_sort) { @@ -524,8 +534,35 @@ class Albums extends Pages { where["formats.name"] = format; } + if (!this.req.user && !collectionUserId) { + throw new ErrorEvent( + 401, + "Cette collection n'est pas publique", + "Cette collection n'est pas publique" + ); + } + + if (collectionUserId) { + const userIsSharingCollection = await UsersModel.findById( + collectionUserId + ); + + if ( + !userIsSharingCollection || + !userIsSharingCollection.isPublicCollection + ) { + throw new ErrorEvent( + 401, + "Cette collection n'est pas publique", + "Cette collection n'est pas publique" + ); + } + + userId = userIsSharingCollection._id; + } + const count = await AlbumsModel.count({ - user: this.req.user._id, + User: userId, ...where, }); @@ -547,7 +584,7 @@ class Albums extends Pages { const rows = await AlbumsModel.find( { - user: this.req.user._id, + User: userId, ...where, }, [], @@ -619,6 +656,29 @@ class Albums extends Pages { this.setPageContent("item", item); } + + /** + * Méthode permettant de créer la page "collection/:userId" + */ + async loadPublicCollection() { + const { userId } = this.req.params; + + const user = await UsersModel.findById(userId); + + if (!user || !user.isPublicCollection) { + throw new ErrorEvent( + 401, + "Cet utilisateur ne souhaite pas partager sa collection" + ); + } + + const artists = await Albums.getAllDistincts("artists_sort", userId); + const formats = await Albums.getAllDistincts("formats.name", userId); + + this.setPageContent("username", user.username); + this.setPageContent("artists", artists); + this.setPageContent("formats", formats); + } } export default Albums; diff --git a/src/middleware/Me.js b/src/middleware/Me.js new file mode 100644 index 0000000..ae2712c --- /dev/null +++ b/src/middleware/Me.js @@ -0,0 +1,45 @@ +import Joi from "joi"; + +import UsersModel from "../models/users"; + +/** + * Classe permettant la gestion de l'utilisateur connecté + */ +class Me { + constructor(req) { + this.req = req; + } + + /** + * Méthode permettant de modifier le profil d'un utilisateur + * @return {Object} + */ + async patchMe() { + const { body, user } = this.req; + + const schema = Joi.object({ + isPublicCollection: Joi.boolean(), + }); + + const value = await schema.validateAsync(body); + const update = await UsersModel.findByIdAndUpdate( + user._id, + { $set: value }, + { new: true } + ); + + await new Promise((resolve, reject) => { + this.req.login(update, (err) => { + if (err) { + return reject(err); + } + + return resolve(null); + }); + }); + + return update; + } +} + +export default Me; diff --git a/src/models/users.js b/src/models/users.js index 0807ccb..96629c0 100644 --- a/src/models/users.js +++ b/src/models/users.js @@ -1,5 +1,7 @@ /* eslint-disable func-names */ /* eslint-disable no-invalid-this */ +/* eslint-disable no-param-reassign */ + import mongoose from "mongoose"; import uniqueValidator from "mongoose-unique-validator"; import crypto from "crypto"; @@ -23,8 +25,20 @@ const UserSchema = new mongoose.Schema( }, hash: String, salt: String, + isPublicCollection: { + type: Boolean, + default: false, + }, }, - { timestamps: true } + { + timestamps: true, + toJSON: { + transform(doc, ret) { + delete ret.hash; + delete ret.salt; + }, + }, + } ); UserSchema.plugin(uniqueValidator, { message: "est déjà utilisé" }); diff --git a/src/routes/api/v1/albums.js b/src/routes/api/v1/albums.js index c8f0f1a..e1caa1f 100644 --- a/src/routes/api/v1/albums.js +++ b/src/routes/api/v1/albums.js @@ -9,7 +9,7 @@ const router = express.Router(); router .route("/") - .get(ensureLoggedIn("/connexion"), async (req, res, next) => { + .get(async (req, res, next) => { try { const albums = new Albums(req); const data = await albums.getAll(); diff --git a/src/routes/api/v1/me.js b/src/routes/api/v1/me.js new file mode 100644 index 0000000..42c46b9 --- /dev/null +++ b/src/routes/api/v1/me.js @@ -0,0 +1,24 @@ +import express from "express"; +import { ensureLoggedIn } from "connect-ensure-login"; + +import { sendResponse } from "../../../libs/format"; + +import Me from "../../../middleware/Me"; + +// eslint-disable-next-line new-cap +const router = express.Router(); + +router + .route("/") + .patch(ensureLoggedIn("/connexion"), async (req, res, next) => { + try { + const me = new Me(req); + const data = await me.patchMe(); + + return sendResponse(req, res, data); + } catch (err) { + return next(err); + } + }); + +export default router; diff --git a/src/routes/collection.js b/src/routes/collection.js new file mode 100644 index 0000000..6584992 --- /dev/null +++ b/src/routes/collection.js @@ -0,0 +1,22 @@ +import express from "express"; + +import Albums from "../middleware/Albums"; + +import render from "../libs/format"; + +// eslint-disable-next-line new-cap +const router = express.Router(); + +router.route("/:userId").get(async (req, res, next) => { + try { + const page = new Albums(req, "collection"); + + await page.loadPublicCollection(); + + render(res, page); + } catch (err) { + next(err); + } +}); + +export default router; diff --git a/src/routes/ma-collection.js b/src/routes/ma-collection.js index 51ff0ee..653c844 100644 --- a/src/routes/ma-collection.js +++ b/src/routes/ma-collection.js @@ -10,7 +10,7 @@ const router = express.Router(); router.route("/").get(ensureLoggedIn("/connexion"), async (req, res, next) => { try { - const page = new Albums(req, "mon-compte/ma-collection"); + const page = new Albums(req, "mon-compte/ma-collection/index"); await page.loadMyCollection(); diff --git a/views/error.ejs b/views/error.ejs index b0e5112..8f80430 100644 --- a/views/error.ejs +++ b/views/error.ejs @@ -5,7 +5,9 @@ Erreur 404

<% } %> + <% if ( process.env.NODE_ENV !== 'production' ) { %>
<%= page.error %>
+ <% } %> \ No newline at end of file diff --git a/views/pages/mon-compte/ma-collection.ejs b/views/pages/collection.ejs similarity index 78% rename from views/pages/mon-compte/ma-collection.ejs rename to views/pages/collection.ejs index b754ccf..da22489 100644 --- a/views/pages/mon-compte/ma-collection.ejs +++ b/views/pages/collection.ejs @@ -1,5 +1,8 @@ -
-

Ma collection

+
+

+ Collection de <%= page.username %> +

+
@@ -40,12 +43,11 @@
- {{ item.artists_sort}} - {{ item.title }} - + {{ item.artists_sort}} - {{ item.title }}
- +
Année : {{ item.year }} @@ -91,23 +93,14 @@ - -
diff --git a/views/pages/composants.ejs b/views/pages/composants.ejs index 7c17b38..dc4f8f2 100644 --- a/views/pages/composants.ejs +++ b/views/pages/composants.ejs @@ -1,8 +1,9 @@ -
+

Les composants

  • Les titres
  • +
  • Les couleurs
  • Les grilles
  • Les boutons
  • Les formulaires
  • @@ -24,6 +25,87 @@
    Titre de niveau 5
    Titre de niveau 6
    +

    Les couleurs

    +

    Polar Night

    +
    +
    +
     
    + nord0 +
    +
    +
     
    + nord1 +
    +
    +
     
    + nord2 +
    +
    +
     
    + nord3 +
    +
    +

    Snow Storm

    +
    +
    +
     
    + nord4 +
    +
    +
     
    + nord5 +
    +
    +
     
    + nord6 +
    +
    +

    Frost

    +
    +
    +
     
    + nord7 +
    +
    +
     
    + nord8 +
    +
    +
     
    + nord9 +
    +
    +
     
    + nord10 +
    +
    +

    Aurora

    +
    +
    +
     
    + nord11 +
    +
    +
     
    + nord12 +
    +
    +
     
    + nord13 +
    +
    +
     
    + nord14 +
    +
    +
     
    + nord15 +
    +
    +

    + Vous pourrez trouver plus d'informations sur le site offciel du projet nord. +

    +

    Les grilles

    Se référer à la documentation de Knacss. @@ -225,13 +307,15 @@ .icon-link-ext .icon-heart .icon-eye + .icon-left-open + .icon-right-open + .icon-export + .icon-share .icon-spin .icon-sun .icon-moon .icon-trash .icon-blind - .icon-left-open - .icon-right-open

    Les listes

    diff --git a/views/pages/mon-compte/ma-collection/exporter.ejs b/views/pages/mon-compte/ma-collection/exporter.ejs index dc1de77..13e3f98 100644 --- a/views/pages/mon-compte/ma-collection/exporter.ejs +++ b/views/pages/mon-compte/ma-collection/exporter.ejs @@ -1,4 +1,4 @@ -
    +

    Exporter ma collection

    Les formats CSV et Excel sont facilement lisiblent par un humain. Dans ces 2 formats vous trouverez seulement les informations principales de vos albums, à savoir : @@ -38,7 +38,7 @@

    - + + + + + + +
+ +