Просмотр исходного кода

feat: breaking out sidebar comp

tags/0.9.0
J 6 лет назад
Родитель
Сommit
6c63feecfb

+ 44
- 0
vue-theme/src/components/sidebar/sidebar.vue Просмотреть файл

@@ -0,0 +1,44 @@
1
+<template lang="pug">
2
+aside.shadow.b-radius
3
+    header
4
+        h4 this is an aisde for {{ type }}
5
+    section
6
+        slot
7
+</template>
8
+
9
+<script>
10
+import { mapGetters } from 'vuex'
11
+
12
+export default {
13
+    props: {
14
+        sidebar: {
15
+            type: Boolean
16
+        },
17
+        type: {
18
+            type: String
19
+        }
20
+    },
21
+    computed: {
22
+        ...mapGetters({
23
+            allArtists: 'allArtists',
24
+            allArtistsLoaded: 'allArtistsLoaded',
25
+
26
+            allEpisodes: 'allEpisodes',
27
+            allEpisodesLoaded: 'allEpisodesLoaded',
28
+        }),
29
+        posts() {
30
+            let type = this.$route.params.type
31
+            type = type.charAt(0).toUpperCase() + type.slice(1)
32
+
33
+            // Return list keyed by slug
34
+            return Object.values(this[`all${type}`]).reduce((postsMap, post) => { 
35
+                postsMap[post.slug] = post
36
+                return postsMap
37
+            }, {})
38
+        },
39
+    },
40
+    mounted() {
41
+        // TODO: this should be conditional after checking vuex stat
42
+    }
43
+}
44
+</script>

+ 3
- 0
vue-theme/src/index.js Просмотреть файл

@@ -12,9 +12,12 @@ import IndexPage from '@/pages/index.vue'
12 12
 const router = new VueRouter({
13 13
     mode: 'history',
14 14
     routes: [
15
+        // Home Page
15 16
         { path: '/', component: IndexPage },
17
+        // List Pages
16 18
         { path: '/episodes', component: () => import(/* webpackChunkName: "pages-list" */ './pages/list.vue'), props: { sidebar: false } },
17 19
         { path: '/:type', component: () => import(/* webpackChunkName: "pages-list" */ './pages/list.vue'), props: { sidebar: true } },
20
+        // Single Pages
18 21
         { path: '/:type/:slug', component: () => import(/* webpackChunkName: "pages-single" */ './pages/single.vue'), props: { sidebar: true } },
19 22
     ]
20 23
 })

+ 0
- 1
vue-theme/src/pages/episodes.vue Просмотреть файл

@@ -1 +0,0 @@
1
-// Episodes has a unique layout

+ 6
- 5
vue-theme/src/pages/list.vue Просмотреть файл

@@ -10,15 +10,13 @@
10 10
         section(v-for="post in posts")
11 11
             router-link(:to="`./${type}/${post.slug}`")
12 12
                 h4 {{ post.title }}
13
-    //- COMPONENT: Make this with a prop
14
-    aside(v-if="sidebar").shadow.b-radius
15
-        header
16
-            h4 this is some other stuff
17
-
13
+    sidebar(v-if="sidebar" :type="`${type}`")
14
+        h1 slots
18 15
 </template>
19 16
 
20 17
 <script>
21 18
 import { mapGetters } from 'vuex'
19
+import sidebar from '@/components/sidebar/sidebar'
22 20
 
23 21
 export default {
24 22
     props: {
@@ -26,6 +24,9 @@ export default {
26 24
             type: Boolean
27 25
         }
28 26
     },
27
+    components: {
28
+        sidebar: sidebar
29
+    },
29 30
     computed: {
30 31
         ...mapGetters({
31 32
             allArtists: 'allArtists',

+ 9
- 7
vue-theme/src/pages/single.vue Просмотреть файл

@@ -6,15 +6,12 @@
6 6
         section
7 7
             h4 {{ posts[$route.params.slug].title }}
8 8
             .block-wrapper(v-for="block in posts[$route.params.slug].blocks" v-html="block")
9
-    //- COMPONENT: Make this with a prop
10
-    aside(v-if="sidebar").shadow.b-radius
11
-        header
12
-            h4 this is some other stuff
13
-
9
+    sidebar(v-if="sidebar" :type="`${type}`")
14 10
 </template>
15 11
 
16 12
 <script>
17 13
 import { mapGetters } from 'vuex'
14
+import sidebar from '@/components/sidebar/sidebar'
18 15
 
19 16
 export default {
20 17
     props: {
@@ -22,6 +19,9 @@ export default {
22 19
             type: Boolean
23 20
         }
24 21
     },
22
+    components: {
23
+        sidebar: sidebar
24
+    },
25 25
     computed: {
26 26
         ...mapGetters({
27 27
             allArtists: 'allArtists',
@@ -30,9 +30,11 @@ export default {
30 30
             allEpisodes: 'allEpisodes',
31 31
             allEpisodesLoaded: 'allEpisodesLoaded',
32 32
         }),
33
+        type() { // Checks for type and fixes Episodes route edge case 
34
+            return this.$route.params.type ? this.$route.params.type : this.$route.fullPath.slice(1)
35
+        },
33 36
         posts() {
34
-            let type = this.$route.params.type
35
-            type = type.charAt(0).toUpperCase() + type.slice(1)
37
+            let type = this.type.charAt(0).toUpperCase() + this.type.slice(1)
36 38
 
37 39
             // Return list keyed by slug
38 40
             return Object.values(this[`all${type}`]).reduce((postsMap, post) => { 

Загрузка…
Отмена
Сохранить