瀏覽代碼

feat: profile - pages

NGPixel 5 年之前
父節點
當前提交
d959ef7e5c
共有 4 個文件被更改,包括 115 次插入3 次删除
  1. 1 1
      client/components/profile.vue
  2. 100 2
      client/components/profile/pages.vue
  3. 12 0
      server/graph/resolvers/page.js
  4. 2 0
      server/graph/schemas/page.graphql

+ 1 - 1
client/components/profile.vue

@@ -22,7 +22,7 @@
         //-     v-list-item-title {{$t('profile:comments.title')}}
         //-     v-list-item-subtitle.caption.grey--text.text--lighten-1 Coming soon
 
-    v-content
+    v-content(:class='darkMode ? "grey darken-4" : "grey lighten-5"')
       transition(name='profile-router')
         router-view
 

+ 100 - 2
client/components/profile/pages.vue

@@ -1,5 +1,5 @@
 <template lang='pug'>
-  v-container(fluid, fill-height, grid-list-lg)
+  v-container(fluid, grid-list-lg)
     v-layout(row wrap)
       v-flex(xs12)
         .profile-header
@@ -7,13 +7,111 @@
           .profile-header-title
             .headline.primary--text.animated.fadeInLeft {{$t('profile:pages.title')}}
             .subheading.grey--text.animated.fadeInLeft {{$t('profile:pages.subtitle')}}
+          v-spacer
+          v-btn.animated.fadeInDown.wait-p1s(color='grey', outlined, @click='refresh', large)
+            v-icon.grey--text mdi-refresh
+      v-flex(xs12)
+        v-card.animated.fadeInUp
+          v-data-table(
+            :items='pages'
+            :headers='headers'
+            :page.sync='pagination'
+            :items-per-page='15'
+            :loading='loading'
+            must-sort,
+            sort-by='updatedAt',
+            sort-desc,
+            hide-default-footer
+          )
+            template(slot='item', slot-scope='props')
+              tr.is-clickable(:active='props.selected', @click='goToPage(props.item.id)')
+                td
+                  .body-2: strong {{ props.item.title }}
+                  .caption {{ props.item.description }}
+                td.admin-pages-path
+                  v-chip(label, small, :color='$vuetify.theme.dark ? `grey darken-4` : `grey lighten-4`') {{ props.item.locale }}
+                  span.ml-2.grey--text(:class='$vuetify.theme.dark ? `text--lighten-1` : `text--darken-2`') / {{ props.item.path }}
+                td {{ props.item.createdAt | moment('calendar') }}
+                td {{ props.item.updatedAt | moment('calendar') }}
+            template(slot='no-data')
+              v-alert.ma-3(icon='mdi-alert', :value='true', outlined, color='grey')
+                em.caption {{$t('profile:pages.emptyList')}}
+          .text-center.py-2.animated.fadeInDown(v-if='this.pageTotal > 1')
+            v-pagination(v-model='pagination', :length='pageTotal')
 </template>
 
 <script>
+import gql from 'graphql-tag'
 
 export default {
   data() {
-    return { }
+    return {
+      selectedPage: {},
+      pagination: 1,
+      pages: [],
+      loading: false
+    }
+  },
+  computed: {
+    headers () {
+      return [
+        { text: this.$t('profile:pages.headerTitle'), value: 'title' },
+        { text: this.$t('profile:pages.headerPath'), value: 'path' },
+        { text: this.$t('profile:pages.headerCreatedAt'), value: 'createdAt', width: 250 },
+        { text: this.$t('profile:pages.headerUpdatedAt'), value: 'updatedAt', width: 250 }
+      ]
+    },
+    pageTotal () {
+      return Math.ceil(this.pages.length / 15)
+    }
+  },
+  methods: {
+    async refresh() {
+      await this.$apollo.queries.pages.refetch()
+      this.$store.commit('showNotification', {
+        message: this.$t('profile:pages.refreshSuccess'),
+        style: 'success',
+        icon: 'cached'
+      })
+    },
+    goToPage(id) {
+      window.location.assign(`/i/` + id)
+    }
+  },
+  apollo: {
+    pages: {
+      query: gql`
+        query($creatorId: Int, $authorId: Int) {
+          pages {
+            list(creatorId: $creatorId, authorId: $authorId) {
+              id
+              locale
+              path
+              title
+              description
+              contentType
+              isPublished
+              isPrivate
+              privateNS
+              createdAt
+              updatedAt
+            }
+          }
+        }
+      `,
+      variables () {
+        return {
+          creatorId: this.$store.get('user/id'),
+          authorId: this.$store.get('user/id')
+        }
+      },
+      fetchPolicy: 'network-only',
+      update: (data) => data.pages.list,
+      watchLoading (isLoading) {
+        this.loading = isLoading
+        this.$store.commit(`loading${isLoading ? 'Start' : 'Stop'}`, 'profile-pages-refresh')
+      }
+    }
   }
 }
 </script>

+ 12 - 0
server/graph/resolvers/page.js

@@ -97,6 +97,18 @@ module.exports = {
           if (args.locale) {
             queryBuilder.where('localeCode', args.locale)
           }
+          if (args.creatorId && args.authorId && args.creatorId > 0 && args.authorId > 0) {
+            queryBuilder.where(function () {
+              this.where('creatorId', args.creatorId).orWhere('authorId', args.authorId)
+            })
+          } else {
+            if (args.creatorId && args.creatorId > 0) {
+              queryBuilder.where('creatorId', args.creatorId)
+            }
+            if (args.authorId && args.authorId > 0) {
+              queryBuilder.where('authorId', args.authorId)
+            }
+          }
           if (args.tags && args.tags.length > 0) {
             queryBuilder.whereIn('tags.tag', args.tags)
           }

+ 2 - 0
server/graph/schemas/page.graphql

@@ -38,6 +38,8 @@ type PageQuery {
     orderByDirection: PageOrderByDirection
     tags: [String!]
     locale: String
+    creatorId: Int
+    authorId: Int
   ): [PageListItem!]! @auth(requires: ["manage:system", "read:pages"])
 
   single(