feat: Users Breadcrumb example with /users/:id
This commit is contained in:
@@ -8,8 +8,8 @@
|
|||||||
</b-link>
|
</b-link>
|
||||||
<SidebarToggler class="d-md-down-none" display="lg" />
|
<SidebarToggler class="d-md-down-none" display="lg" />
|
||||||
<b-navbar-nav class="d-md-down-none">
|
<b-navbar-nav class="d-md-down-none">
|
||||||
<b-nav-item class="px-3">Dashboard</b-nav-item>
|
<b-nav-item class="px-3" to="/dashboard">Dashboard</b-nav-item>
|
||||||
<b-nav-item class="px-3">Users</b-nav-item>
|
<b-nav-item class="px-3" to="/users" exact>Users</b-nav-item>
|
||||||
<b-nav-item class="px-3">Settings</b-nav-item>
|
<b-nav-item class="px-3">Settings</b-nav-item>
|
||||||
</b-navbar-nav>
|
</b-navbar-nav>
|
||||||
<b-navbar-nav class="ml-auto">
|
<b-navbar-nav class="ml-auto">
|
||||||
@@ -37,7 +37,7 @@
|
|||||||
<SidebarMinimizer/>
|
<SidebarMinimizer/>
|
||||||
</AppSidebar>
|
</AppSidebar>
|
||||||
<main class="main">
|
<main class="main">
|
||||||
<breadcrumb :list="list"/>
|
<Breadcrumb :list="list"/>
|
||||||
<div class="container-fluid">
|
<div class="container-fluid">
|
||||||
<router-view></router-view>
|
<router-view></router-view>
|
||||||
</div>
|
</div>
|
||||||
@@ -54,7 +54,7 @@
|
|||||||
</template>
|
</template>
|
||||||
|
|
||||||
<script>
|
<script>
|
||||||
import nav from '../_nav'
|
import nav from '@/_nav'
|
||||||
import { Header as AppHeader, SidebarToggler, Sidebar as AppSidebar, SidebarFooter, SidebarForm, SidebarHeader, SidebarMinimizer, SidebarNav, Aside as AppAside, AsideToggler, Footer as TheFooter, Breadcrumb } from '@coreui/vue'
|
import { Header as AppHeader, SidebarToggler, Sidebar as AppSidebar, SidebarFooter, SidebarForm, SidebarHeader, SidebarMinimizer, SidebarNav, Aside as AppAside, AsideToggler, Footer as TheFooter, Breadcrumb } from '@coreui/vue'
|
||||||
import DefaultAside from './DefaultAside'
|
import DefaultAside from './DefaultAside'
|
||||||
import DefaultHeaderDropdownAccnt from './DefaultHeaderDropdownAccnt'
|
import DefaultHeaderDropdownAccnt from './DefaultHeaderDropdownAccnt'
|
||||||
@@ -87,7 +87,7 @@ export default {
|
|||||||
return this.$route.name
|
return this.$route.name
|
||||||
},
|
},
|
||||||
list () {
|
list () {
|
||||||
return this.$route.matched
|
return this.$route.matched.filter((route) => route.name || route.meta.label )
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -54,6 +54,10 @@ const Page500 = () => import('@/views/pages/Page500')
|
|||||||
const Login = () => import('@/views/pages/Login')
|
const Login = () => import('@/views/pages/Login')
|
||||||
const Register = () => import('@/views/pages/Register')
|
const Register = () => import('@/views/pages/Register')
|
||||||
|
|
||||||
|
// Users
|
||||||
|
const Users = () => import('@/views/users/Users')
|
||||||
|
const User = () => import('@/views/users/User')
|
||||||
|
|
||||||
Vue.use(Router)
|
Vue.use(Router)
|
||||||
|
|
||||||
export default new Router({
|
export default new Router({
|
||||||
@@ -102,6 +106,25 @@ export default new Router({
|
|||||||
name: 'Widgets',
|
name: 'Widgets',
|
||||||
component: Widgets
|
component: Widgets
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
path: 'users',
|
||||||
|
meta: { label: 'Users'},
|
||||||
|
component: {
|
||||||
|
render (c) { return c('router-view') }
|
||||||
|
},
|
||||||
|
children: [
|
||||||
|
{
|
||||||
|
path: '',
|
||||||
|
component: Users,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
path: ':id',
|
||||||
|
meta: { label: 'User Details'},
|
||||||
|
name: 'User',
|
||||||
|
component: User,
|
||||||
|
},
|
||||||
|
]
|
||||||
|
},
|
||||||
{
|
{
|
||||||
path: 'base',
|
path: 'base',
|
||||||
redirect: '/base/cards',
|
redirect: '/base/cards',
|
||||||
|
|||||||
@@ -0,0 +1,51 @@
|
|||||||
|
<template>
|
||||||
|
<b-row>
|
||||||
|
<b-col cols="12" lg="6">
|
||||||
|
<b-card no-header>
|
||||||
|
<template slot="header">
|
||||||
|
User id: {{ $route.params.id }}
|
||||||
|
</template>
|
||||||
|
<b-table striped small fixed responsive="sm" :items="items($route.params.id)" :fields="fields">
|
||||||
|
<template slot="value" slot-scope="data">
|
||||||
|
<strong>{{data.item.value}}</strong>
|
||||||
|
</template>
|
||||||
|
</b-table>
|
||||||
|
<template slot="footer">
|
||||||
|
<b-button @click="goBack">Back</b-button>
|
||||||
|
</template>
|
||||||
|
</b-card>
|
||||||
|
</b-col>
|
||||||
|
</b-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import usersData from './UsersData'
|
||||||
|
export default {
|
||||||
|
name: 'User',
|
||||||
|
props: {
|
||||||
|
caption: {
|
||||||
|
type: String,
|
||||||
|
default: 'User id'
|
||||||
|
},
|
||||||
|
},
|
||||||
|
data: () => {
|
||||||
|
return {
|
||||||
|
items: (id) => {
|
||||||
|
const user = usersData.find( user => user.id.toString() === id)
|
||||||
|
const userDetails = user ? Object.entries(user) : [['id', 'Not found']]
|
||||||
|
return userDetails.map(([key, value]) => {return {key: key, value: value}})
|
||||||
|
},
|
||||||
|
fields: [
|
||||||
|
{key: 'key'},
|
||||||
|
{key: 'value'},
|
||||||
|
],
|
||||||
|
}
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
goBack() {
|
||||||
|
this.$router.go(-1)
|
||||||
|
// this.$router.replace({path: '/users'})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
<template>
|
||||||
|
<b-row>
|
||||||
|
<b-col cols="12" xl="6">
|
||||||
|
<transition name="slide">
|
||||||
|
<b-card :header="caption">
|
||||||
|
<b-table :hover="hover" :striped="striped" :bordered="bordered" :small="small" :fixed="fixed" responsive="sm" :items="items" :fields="fields" :current-page="currentPage" :per-page="perPage" @row-clicked="rowClicked">
|
||||||
|
<template slot="id" slot-scope="data">
|
||||||
|
<strong>{{data.item.id}}</strong>
|
||||||
|
</template>
|
||||||
|
<template slot="name" slot-scope="data">
|
||||||
|
<strong>{{data.item.name}}</strong>
|
||||||
|
</template>
|
||||||
|
<template slot="status" slot-scope="data">
|
||||||
|
<b-badge :variant="getBadge(data.item.status)">{{data.item.status}}</b-badge>
|
||||||
|
</template>
|
||||||
|
</b-table>
|
||||||
|
<nav>
|
||||||
|
<b-pagination size="sm" :total-rows="getRowCount(items)" :per-page="perPage" v-model="currentPage" prev-text="Prev" next-text="Next" hide-goto-end-buttons/>
|
||||||
|
</nav>
|
||||||
|
</b-card>
|
||||||
|
</transition>
|
||||||
|
</b-col>
|
||||||
|
</b-row>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<script>
|
||||||
|
import usersData from './UsersData'
|
||||||
|
export default {
|
||||||
|
name: 'Users',
|
||||||
|
props: {
|
||||||
|
caption: {
|
||||||
|
type: String,
|
||||||
|
default: 'Users'
|
||||||
|
},
|
||||||
|
hover: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
striped: {
|
||||||
|
type: Boolean,
|
||||||
|
default: true
|
||||||
|
},
|
||||||
|
bordered: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
small: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
},
|
||||||
|
fixed: {
|
||||||
|
type: Boolean,
|
||||||
|
default: false
|
||||||
|
}
|
||||||
|
},
|
||||||
|
data: () => {
|
||||||
|
return {
|
||||||
|
items: usersData.filter((user) => user.id < 42),
|
||||||
|
fields: [
|
||||||
|
{key: 'id'},
|
||||||
|
{key: 'name'},
|
||||||
|
{key: 'registered'},
|
||||||
|
{key: 'role'},
|
||||||
|
{key: 'status'}
|
||||||
|
],
|
||||||
|
currentPage: 1,
|
||||||
|
perPage: 5,
|
||||||
|
totalRows: 0
|
||||||
|
}
|
||||||
|
},
|
||||||
|
computed: {
|
||||||
|
},
|
||||||
|
methods: {
|
||||||
|
getBadge (status) {
|
||||||
|
return status === 'Active' ? 'success'
|
||||||
|
: status === 'Inactive' ? 'secondary'
|
||||||
|
: status === 'Pending' ? 'warning'
|
||||||
|
: status === 'Banned' ? 'danger' : 'primary'
|
||||||
|
},
|
||||||
|
getRowCount (items) {
|
||||||
|
return items.length
|
||||||
|
},
|
||||||
|
userLink (id) {
|
||||||
|
return `users/${id.toString()}`
|
||||||
|
},
|
||||||
|
rowClicked (item) {
|
||||||
|
const userLink = this.userLink(item.id)
|
||||||
|
this.$router.push({path: userLink})
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.card-body >>> table > tbody > tr > td {
|
||||||
|
cursor: pointer;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
const usersData = [
|
||||||
|
{id: 0, name: 'John Doe', registered: '2018/01/01', role: 'Guest', status: 'Pending'},
|
||||||
|
{id: 1, name: 'Samppa Nori', registered: '2018/01/01', role: 'Member', status: 'Active'},
|
||||||
|
{id: 2, name: 'Estavan Lykos', registered: '2018/02/01', role: 'Staff', status: 'Banned'},
|
||||||
|
{id: 3, name: 'Chetan Mohamed', registered: '2018/02/01', role: 'Admin', status: 'Inactive'},
|
||||||
|
{id: 4, name: 'Derick Maximinus', registered: '2018/03/01', role: 'Member', status: 'Pending'},
|
||||||
|
{id: 5, name: 'Friderik Dávid', registered: '2018/01/21', role: 'Staff', status: 'Active'},
|
||||||
|
{id: 6, name: 'Yiorgos Avraamu', registered: '2018/01/01', role: 'Member', status: 'Active'},
|
||||||
|
{id: 7, name: 'Avram Tarasios', registered: '2018/02/01', role: 'Staff', status: 'Banned'},
|
||||||
|
{id: 8, name: 'Quintin Ed', registered: '2018/02/01', role: 'Admin', status: 'Inactive'},
|
||||||
|
{id: 9, name: 'Enéas Kwadwo', registered: '2018/03/01', role: 'Member', status: 'Pending'},
|
||||||
|
{id: 10, name: 'Agapetus Tadeáš', registered: '2018/01/21', role: 'Staff', status: 'Active'},
|
||||||
|
{id: 11, name: 'Carwyn Fachtna', registered: '2018/01/01', role: 'Member', status: 'Active'},
|
||||||
|
{id: 12, name: 'Nehemiah Tatius', registered: '2018/02/01', role: 'Staff', status: 'Banned'},
|
||||||
|
{id: 13, name: 'Ebbe Gemariah', registered: '2018/02/01', role: 'Admin', status: 'Inactive'},
|
||||||
|
{id: 14, name: 'Eustorgios Amulius', registered: '2018/03/01', role: 'Member', status: 'Pending'},
|
||||||
|
{id: 15, name: 'Leopold Gáspár', registered: '2018/01/21', role: 'Staff', status: 'Active'},
|
||||||
|
{id: 16, name: 'Pompeius René', registered: '2018/01/01', role: 'Member', status: 'Active'},
|
||||||
|
{id: 17, name: 'Paĉjo Jadon', registered: '2018/02/01', role: 'Staff', status: 'Banned'},
|
||||||
|
{id: 18, name: 'Micheal Mercurius', registered: '2018/02/01', role: 'Admin', status: 'Inactive'},
|
||||||
|
{id: 19, name: 'Ganesha Dubhghall', registered: '2018/03/01', role: 'Member', status: 'Pending'},
|
||||||
|
{id: 20, name: 'Hiroto Šimun', registered: '2018/01/21', role: 'Staff', status: 'Active'},
|
||||||
|
{id: 21, name: 'Vishnu Serghei', registered: '2018/01/01', role: 'Member', status: 'Active'},
|
||||||
|
{id: 22, name: 'Zbyněk Phoibos', registered: '2018/02/01', role: 'Staff', status: 'Banned'},
|
||||||
|
{id: 23, name: 'Einar Randall', registered: '2018/02/01', role: 'Admin', status: 'Inactive'},
|
||||||
|
{id: 24, name: 'Félix Troels', registered: '2018/03/21', role: 'Staff', status: 'Active'},
|
||||||
|
{id: 25, name: 'Aulus Agmundr', registered: '2018/01/01', role: 'Member', status: 'Pending'},
|
||||||
|
{id: 42, name: 'Ford Prefex', registered: '2001/05/21', role: 'Alien', status: 'Don\'t panic!'}
|
||||||
|
]
|
||||||
|
|
||||||
|
export default usersData
|
||||||
Reference in New Issue
Block a user