Pārlūkot izejas kodu

feat: proper linking from list component | feat: working single page

tags/0.9.0
J 6 gadus atpakaļ
vecāks
revīzija
31144ec06a

+ 6
- 0
vue-theme/src/index.js Parādīt failu

@@ -9,6 +9,7 @@ import store from '@/store'
9 9
 
10 10
 import IndexPage from '@/pages/index.vue'
11 11
 import ListPage from '@/pages/list'
12
+import SinglePage from '@/pages/single'
12 13
 
13 14
 const router = new VueRouter({
14 15
     mode: 'history',
@@ -20,6 +21,11 @@ const router = new VueRouter({
20 21
             component: ListPage,
21 22
             props: { sidebar: true }
22 23
         },
24
+        {
25
+            path: '/:type/:id',
26
+            component: SinglePage,
27
+            props: { sidebar: true }
28
+        },
23 29
     ]
24 30
 })
25 31
 

+ 3
- 2
vue-theme/src/pages/list.vue Parādīt failu

@@ -5,10 +5,11 @@
5 5
             h1 {{ site }}: {{ $route.params.type }} list
6 6
         section
7 7
             h4 {{ $route.params.type }}
8
-            p {{ Object.values(allArtists).length }}
8
+            p {{ Object.values(posts).length }}
9 9
             p {{ sidebar }}
10 10
         section(v-for="post in posts")
11
-            h4 {{ post.title }}
11
+            router-link(:to="`./${$route.params.type}/${post.slug}`")
12
+                h4 {{ post.title }}
12 13
     //- COMPONENT: Make this with a prop
13 14
     aside(v-if="sidebar").shadow.b-radius
14 15
         header

+ 27
- 48
vue-theme/src/pages/single.vue Parādīt failu

@@ -1,42 +1,15 @@
1
-// Single page for single episode/artist/page/edu-guide
2
-// Optional sidebar
3
-// Homepage grid
4 1
 <template lang="pug">
5
-.page--index.f-row.between
6
-    article.f-grow.shadow.b-radius
2
+.page--single.f-row.between
3
+    article.f-grow
7 4
         header
8
-            h1 {{ site }}: index
9
-        section(v-if="allEpisodesLoaded")
10
-            h4 Episodes
11
-            p {{ Object.values(allEpisodes).length }}
12
-        section(v-if="allArtistsLoaded")
13
-            h4 artists
14
-            p {{ Object.values(allArtists).length }}
15
-        section(v-if="allPagesLoaded")
16
-            h4 pages
17
-            p {{ Object.values(allPages).length }}
18
-        section(v-if="allPostsLoaded")
19
-            h4 posts
20
-            p {{ Object.values(allPosts).length }}
5
+            h1 {{ $route.params.type }}:{{ $route.params.id }} single
21 6
         section
22
-            //- COMPONENT: Looping component
23
-            .post(v-for="post in allPosts")
24
-                h4.post--title {{ post.slug }}
25
-                ul.post--content
26
-                    li.post--content--block(v-for="block in post.blocks" v-html="block")
27
-        footer.f-row
28
-            p icon
29
-
7
+            h4 {{ posts[$route.params.id].title }}
8
+            .block-wrapper(v-for="block in posts[$route.params.id].blocks" v-html="block")
30 9
     //- COMPONENT: Make this with a prop
31
-    aside.shadow.b-radius
10
+    aside(v-if="sidebar").shadow.b-radius
32 11
         header
33 12
             h4 this is some other stuff
34
-        section(v-if="allPostsLoaded")
35
-            //- COMPONENT: See above
36
-            .post(v-for="post in allPosts")
37
-                h4.post--title {{ post.slug }}
38
-                ul.post--content
39
-                    li.post--content--block(v-for="block in post.blocks" v-html="block")
40 13
 
41 14
 </template>
42 15
 
@@ -44,34 +17,40 @@
44 17
 import { mapGetters } from 'vuex'
45 18
 
46 19
 export default {
20
+    props: {
21
+        sidebar: {
22
+            type: Boolean
23
+        }
24
+    },
47 25
     computed: {
48 26
         ...mapGetters({
49
-            somePages: 'somePages',
50
-            allPages: 'allPages',
51
-            allPostsLoaded: 'allPostsLoaded',
52
-            allPosts: 'allPosts',
53
-            allPagesLoaded: 'allPagesLoaded',
54 27
             allArtists: 'allArtists',
55 28
             allArtistsLoaded: 'allArtistsLoaded',
29
+
56 30
             allEpisodes: 'allEpisodes',
57 31
             allEpisodesLoaded: 'allEpisodesLoaded',
58 32
         }),
33
+        posts() {
34
+            let type = this.$route.params.type
35
+            type = type.charAt(0).toUpperCase() + type.slice(1)
36
+
37
+            // Return list keyed by slug
38
+            return Object.values(this[`all${type}`]).reduce((acc, inc) => { 
39
+                acc[inc.slug] = inc
40
+                return acc
41
+            }, {})
42
+        },
59 43
     },
60 44
     data() {
61 45
         return {
62
-            site: wp.site_name,
46
+            loaded: false,
63 47
         }
64 48
     },
65 49
     mounted() {
66
-        console.log('routes: ', wp.routes)
67
-        console.log('rest url: ', wp.rest)
68
-        console.log('template: ', wp.template)
69
-
70
-        this.$store.dispatch('getAllPages')
71
-        this.$store.dispatch('getAllPosts')
72
-
73
-        this.$store.dispatch('getAllArtists')
74
-        this.$store.dispatch('getAllEpisodes')
50
+        // TODO: this should be conditional after checking vuex state
51
+        let type = this.$route.params.type
52
+        type = type.charAt(0).toUpperCase() + type.slice(1)
53
+        this.$store.dispatch(`getAll${type}`)
75 54
     }
76 55
 }
77 56
 </script>

+ 2
- 0
vue-theme/src/store/index.js Parādīt failu

@@ -14,6 +14,8 @@ Vue.use(Vuex)
14 14
 
15 15
 const debug = process.env.NODE_ENV !== 'production'
16 16
 
17
+Vue.config.devtools = true 
18
+
17 19
 // Current page state
18 20
 const state = {
19 21
   title: 'Test',

Notiek ielāde…
Atcelt
Saglabāt