From d144b100b473a8ab9ca4857c3983f6ac93b41616 Mon Sep 17 00:00:00 2001 From: Jonathan Foucher <jfoucher@gmail.com> Date: Tue, 21 Jun 2022 16:46:48 +0200 Subject: [PATCH] Add page header with breadcrumbs + page title configurable in the routes. Fixes https://app.asana.com/0/1202404842967175/1202478652082893 and https://app.asana.com/0/1202404842967175/1202478652082899 --- resources/js/components/App.vue | 5 +- .../js/components/Collectivities/List.vue | 8 +- .../Collectivities/Single/index.vue | 1 - .../js/components/Collectivities/index.vue | 2 +- resources/js/components/Menu/PageHeader.vue | 81 +++++++++ resources/js/components/Users/List.vue | 4 - resources/js/components/Users/Profile.vue | 2 +- resources/js/components/Users/Single.vue | 1 - resources/js/components/Users/index.vue | 2 +- resources/js/routes/index.js | 167 +++++++++++++++--- 10 files changed, 233 insertions(+), 40 deletions(-) create mode 100644 resources/js/components/Menu/PageHeader.vue diff --git a/resources/js/components/App.vue b/resources/js/components/App.vue index 8e9d5985..75eef4e4 100644 --- a/resources/js/components/App.vue +++ b/resources/js/components/App.vue @@ -47,6 +47,7 @@ <Side v-if="user"></Side> <div class="content-wrapper bg-light"> + <PageHeader></PageHeader> <router-view></router-view> </div> <div class="sidebar-closed-overlay" v-if="!closed" @click="close"></div> @@ -56,6 +57,7 @@ <script> import Side from "./Menu/Side"; import md5 from "crypto-js/md5"; +import PageHeader from './Menu/PageHeader' export default { name: 'App', @@ -102,7 +104,8 @@ export default { }, }, components: { - Side + Side, + PageHeader, } } </script> diff --git a/resources/js/components/Collectivities/List.vue b/resources/js/components/Collectivities/List.vue index 91aa9b61..3bec8733 100644 --- a/resources/js/components/Collectivities/List.vue +++ b/resources/js/components/Collectivities/List.vue @@ -1,9 +1,5 @@ <template> <div> - <!-- https://matanya.gitbook.io/vue-tables-2/child-rows --> - <div class="mb-3"> - <span class="h3">Liste des collectivités</span> - </div> <router-link to="/collectivites/nouveau" class="btn btn-primary"><i class="fas fa-plus"></i> Créer une collectivité</router-link> <div class="bg-white p-3 mt-4" v-if="isAdmin()"> @@ -26,8 +22,8 @@ </template> <script> -import isAdmin from '../../utils/isAdmin'; -import toaster from '../../utils/toaster'; +import isAdmin from '../../utils/isAdmin'; +import toaster from '../../utils/toaster'; export default { name : "CollectivitiesList", diff --git a/resources/js/components/Collectivities/Single/index.vue b/resources/js/components/Collectivities/Single/index.vue index b58dbce8..7472b8af 100644 --- a/resources/js/components/Collectivities/Single/index.vue +++ b/resources/js/components/Collectivities/Single/index.vue @@ -1,6 +1,5 @@ <template> <div> - <div class="mb-3 h3">{{ org.id ? 'Éditer' : 'Créer' }} une collectivité</div> <div class="row" v-if="errors"> <div class="col-12"> <div class="alert alert-danger" v-if="errors.status === 422" > diff --git a/resources/js/components/Collectivities/index.vue b/resources/js/components/Collectivities/index.vue index fc172abc..9f34fef6 100644 --- a/resources/js/components/Collectivities/index.vue +++ b/resources/js/components/Collectivities/index.vue @@ -1,5 +1,5 @@ <template> - <div class="m-5"> + <div class="mb-5 mx-5 mt-0"> <router-view></router-view> </div> </template> diff --git a/resources/js/components/Menu/PageHeader.vue b/resources/js/components/Menu/PageHeader.vue new file mode 100644 index 00000000..cd8e08df --- /dev/null +++ b/resources/js/components/Menu/PageHeader.vue @@ -0,0 +1,81 @@ +<template> + <div class="content-header"> + <div class="container"> + <div class="row mb-0"> + <div class="col-md-6"> + <h1 class="m-0"> + {{ $route.meta.title }} + <small class="text-sm text-muted">{{ itemName }}</small> + </h1> + </div> + <div class="col-md-6"> + <nav aria-label="breadcrumb"> + <ol class="breadcrumb float-sm-right"> + <li v-for="route in matched" class="breadcrumb-item" v-if="route.name"> + <router-link :to="route.path ? route.path : '/'"> + <i :class="'fas ' + route.meta.icon"></i> + {{route.name}} + </router-link> + </li> + <li class="breadcrumb-item" v-if="$route.name"> + <i :class="'fas ' + $route.meta.icon"></i> + {{$route.name}} + </li> + </ol> + </nav> + </div> + </div> + </div> + </div> +</template> +<script> +export default { + name: 'Breadcrumbs', + data() { + return { + routes: [] + } + }, + computed: { + matched() { + console.log('matched', this.$route.matched) + console.log('route', this.$route) + return this.$route.matched.slice(0, -1) + }, + itemName() { + console.log(this.$route) + if (!this.$route.meta.type || !this.$route.params.id) { + return null; + } + + switch (this.$route.meta.type) { + case 'user': + const user = this.$store.state.users.all.find(u => u.id === parseInt(this.$route.params.id, 10)) + if (!user) { + return null; + } + return user.firstname + ' ' + user.lastname + case 'organization': + const org = this.$store.state.organizations.all.find(o => o.id === parseInt(this.$route.params.id, 10)) + if (!org) { + return null; + } + return org.name + case 'profile': + const u = this.$store.state.user.data + if (!u) { + return null; + } + return u.firstname + ' ' + u.lastname + default: + return null; + } + } + }, +} +</script> +<style scoped> +li > a { + text-decoration:none; +} +</style> diff --git a/resources/js/components/Users/List.vue b/resources/js/components/Users/List.vue index d40c18f8..46c4012b 100644 --- a/resources/js/components/Users/List.vue +++ b/resources/js/components/Users/List.vue @@ -1,9 +1,5 @@ <template> <div> - <!-- https://matanya.gitbook.io/vue-tables-2/child-rows --> - <div class="mb-3"> - <span class="h3">Liste des utilisateurs</span> - </div> <router-link to="/utilisateurs/nouveau" class="btn btn-primary"><i class="fas fa-plus"></i> Créer un utilisateur</router-link> <div class="bg-white p-3 mt-4" v-if="isAdmin()"> diff --git a/resources/js/components/Users/Profile.vue b/resources/js/components/Users/Profile.vue index 0b894c78..eec7dfd7 100644 --- a/resources/js/components/Users/Profile.vue +++ b/resources/js/components/Users/Profile.vue @@ -1,5 +1,5 @@ <template> - <div class="m-5"> + <div class="mb-5 mx-5 mt-0"> <router-view></router-view> </div> </template> diff --git a/resources/js/components/Users/Single.vue b/resources/js/components/Users/Single.vue index 133cacb0..b37ed7fd 100644 --- a/resources/js/components/Users/Single.vue +++ b/resources/js/components/Users/Single.vue @@ -1,6 +1,5 @@ <template> <div> - <div class="mb-3 h3">{{ user.id ? 'Modifier' : 'Créer' }} un utilisateur</div> <div class="row" v-if="errors"> <div class="col-12"> <div class="alert alert-danger" v-if="errors.status === 422" > diff --git a/resources/js/components/Users/index.vue b/resources/js/components/Users/index.vue index b9266b3e..d5e36217 100644 --- a/resources/js/components/Users/index.vue +++ b/resources/js/components/Users/index.vue @@ -1,5 +1,5 @@ <template> - <div class="m-5"> + <div class="mb-5 mx-5 mt-0"> <router-view></router-view> </div> </template> diff --git a/resources/js/routes/index.js b/resources/js/routes/index.js index cb57d066..819451f0 100644 --- a/resources/js/routes/index.js +++ b/resources/js/routes/index.js @@ -15,29 +15,148 @@ import EvaluationsList from "../components/Evaluations/List"; export default [ - { path: '/', component: App, children: [ - { path: '', component: Dashboard }, - { path: 'login', component: Login }, - - { path: 'profil', component: Profile, children: [ - { path: '', component: SingleUser }, - ]}, - { path: 'utilisateurs', component: Users, children: [ - { path: '', component: UsersList }, - { path: ':id', component: SingleUser }, - { path: 'nouveau', component: SingleUser }, - ]}, - { path: 'evaluations', component: Evaluations, children: [ - { path: '', component: EvaluationsList }, - ]}, - { path: 'mesures', component: Measures, children: [ - { path: '', component: MeasuresList }, - ]}, - { path: 'collectivites', component: Collectivities, children: [ - { path: '', component: CollectivitiesList }, - { path: ':id', component: SingleCollectivity }, - { path: 'nouveau', component: SingleCollectivity }, - ]}, + { + path: '/', + name: 'Tableau de bord', + component: App, + meta: { + icon: 'fa-tachometer-alt', + title: 'Tableau de bord', + }, + children: [ + { + path: '', + component: Dashboard, + meta: { + icon: 'fa-tachometer-alt', + title: 'Tableau de bord', + }, + }, + { + path: 'login', + component: Login + }, + { + name: 'Profil', + path: 'profil', + component: Profile, + children: [ + { + path: '', + component: SingleUser, + meta: { + icon: 'fa-user', + title: 'Modifier votre profil', + type: 'profile', + }, + }, + ], + }, + { + path: 'utilisateurs', + component: Users, + name: 'Utilisateurs', + meta: { + icon: 'fa-users', + title: 'Liste des utilisateurs', + }, + children: [ + { + path: '', + component: UsersList, + meta: { + icon: 'fa-users', + title: 'Liste des utilisateurs', + }, + }, + { + name: 'Nouvel Utilisateur', + path: 'nouveau', + component: SingleUser, + meta: { + icon: 'fa-user', + title: 'Créer un utilisateur', + type: 'user', + }, + }, + { + name: 'Modification', + path: ':id', + component: SingleUser, + meta: { + icon: 'fa-user', + title: 'Modifier un utilisateur', + type: 'user', + }, + }, + ] + }, + { + path: 'evaluations', + name: 'Evaluations', + meta: { + icon: 'fa-search' + }, + component: Evaluations, + children: [ + { + path: '', + component: EvaluationsList, + }, + ] + }, + { + path: 'mesures', + name: 'Mesures de sécurité', + meta: { + icon: 'fa-list' + }, + component: Measures, + children: [ + { + path: '', + component: MeasuresList, + }, + ] + }, + { + path: 'collectivites', + name: 'Collectivités', + meta: { + icon: 'fa-home', + title: 'Liste des collectivités', + }, + component: Collectivities, + children: [ + { + path: '', + component: CollectivitiesList, + meta: { + icon: 'fa-home', + title: 'Liste des collectivités', + }, + }, + { + name: 'Nouvelle collectivité', + path: 'nouveau', + component: SingleCollectivity, + meta: { + icon: 'fa-home', + title: 'Créer une collectivité', + type: 'organization', + }, + }, + { + name: 'Modification', + path: ':id', + component: SingleCollectivity, + meta: { + icon: 'fa-home', + title: 'Modifier une collectivité', + type: 'organization', + }, + }, + ] + }, ]}, - ]; -- GitLab