소스 검색

feat: comments UI

NGPixel 5 년 전
부모
커밋
abc9e4e1d4
4개의 변경된 파일81개의 추가작업 그리고 6개의 파일을 삭제
  1. 2 1
      client/client-app.js
  2. 60 0
      client/components/comments.vue
  3. 6 1
      client/store/page.js
  4. 13 4
      client/themes/default/components/page.vue

+ 2 - 1
client/client-app.js

@@ -149,9 +149,9 @@ Vue.prototype.Velocity = Velocity
 // ====================================
 // ====================================
 
 
 Vue.component('admin', () => import(/* webpackChunkName: "admin" */ './components/admin.vue'))
 Vue.component('admin', () => import(/* webpackChunkName: "admin" */ './components/admin.vue'))
+Vue.component('comments', () => import(/* webpackChunkName: "comments" */ './components/comments.vue'))
 Vue.component('editor', () => import(/* webpackPrefetch: -100, webpackChunkName: "editor" */ './components/editor.vue'))
 Vue.component('editor', () => import(/* webpackPrefetch: -100, webpackChunkName: "editor" */ './components/editor.vue'))
 Vue.component('history', () => import(/* webpackChunkName: "history" */ './components/history.vue'))
 Vue.component('history', () => import(/* webpackChunkName: "history" */ './components/history.vue'))
-Vue.component('page-source', () => import(/* webpackChunkName: "source" */ './components/source.vue'))
 Vue.component('loader', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/loader.vue'))
 Vue.component('loader', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/loader.vue'))
 Vue.component('login', () => import(/* webpackPrefetch: true, webpackChunkName: "login" */ './components/login.vue'))
 Vue.component('login', () => import(/* webpackPrefetch: true, webpackChunkName: "login" */ './components/login.vue'))
 Vue.component('nav-header', () => import(/* webpackMode: "eager" */ './components/common/nav-header.vue'))
 Vue.component('nav-header', () => import(/* webpackMode: "eager" */ './components/common/nav-header.vue'))
@@ -159,6 +159,7 @@ Vue.component('new-page', () => import(/* webpackChunkName: "new-page" */ './com
 Vue.component('notify', () => import(/* webpackMode: "eager" */ './components/common/notify.vue'))
 Vue.component('notify', () => import(/* webpackMode: "eager" */ './components/common/notify.vue'))
 Vue.component('not-found', () => import(/* webpackChunkName: "not-found" */ './components/not-found.vue'))
 Vue.component('not-found', () => import(/* webpackChunkName: "not-found" */ './components/not-found.vue'))
 Vue.component('page-selector', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/page-selector.vue'))
 Vue.component('page-selector', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/page-selector.vue'))
+Vue.component('page-source', () => import(/* webpackChunkName: "source" */ './components/source.vue'))
 Vue.component('profile', () => import(/* webpackChunkName: "profile" */ './components/profile.vue'))
 Vue.component('profile', () => import(/* webpackChunkName: "profile" */ './components/profile.vue'))
 Vue.component('register', () => import(/* webpackChunkName: "register" */ './components/register.vue'))
 Vue.component('register', () => import(/* webpackChunkName: "register" */ './components/register.vue'))
 Vue.component('search-results', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/search-results.vue'))
 Vue.component('search-results', () => import(/* webpackPrefetch: true, webpackChunkName: "ui-extra" */ './components/common/search-results.vue'))

+ 60 - 0
client/components/comments.vue

@@ -0,0 +1,60 @@
+<template lang="pug">
+  div
+    v-textarea#discussion-new(
+      solo
+      flat
+      placeholder='Write a new comment...'
+      auto-grow
+      dense
+      rows='3'
+      hide-details
+    )
+    .d-flex.align-center.pt-3
+      v-icon.mr-1(color='blue-grey') mdi-language-markdown-outline
+      .caption.blue-grey--text Markdown Format
+      v-spacer
+      v-btn(
+        dark
+        color='pink darken-4'
+        )
+        v-icon(left) mdi-comment
+        span Post Comment
+    v-divider.mt-3
+    v-timeline(
+      dense
+      )
+      v-timeline-item(
+        color='pink darken-4'
+        large
+        )
+        template(v-slot:icon)
+          v-avatar
+            v-img(src='http://i.pravatar.cc/64')
+        v-card.elevation-1
+          v-card-text
+            .caption: strong John Smith
+            .overline.grey--text 3 minutes ago
+            .mt-3 Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sem arcu, mollis et erat quis, convallis tempor urna. In dictum pharetra consequat. #[br] #[br] Integer placerat ultrices nisl eget tincidunt. Curabitur sagittis tortor ut libero semper, et mollis odio ultrices. Sed consectetur sollicitudin ipsum, in commodo augue.
+      v-timeline-item(
+        color='pink darken-4'
+        large
+        )
+        template(v-slot:icon)
+          v-avatar
+            v-img(src='http://i.pravatar.cc/32')
+        v-card.elevation-1
+          v-card-text
+            .caption: strong Nikola Tesla
+            .overline.grey--text Yesterday at 8:03 AM
+            .mt-3 Integer placerat ultrices nisl eget tincidunt. Curabitur sagittis tortor ut libero semper, et mollis odio ultrices. Sed consectetur sollicitudin ipsum, in commodo augue. Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec sem arcu, mollis et erat quis, convallis tempor urna. In dictum pharetra consequat.
+</template>
+
+<script>
+export default {
+
+}
+</script>
+
+<style lang="scss">
+
+</style>

+ 6 - 1
client/store/page.js

@@ -14,7 +14,12 @@ const state = {
   tags: [],
   tags: [],
   title: '',
   title: '',
   updatedAt: '',
   updatedAt: '',
-  mode: ''
+  mode: '',
+  comments: {
+    view: false,
+    post: false,
+    manage: false
+  }
 }
 }
 
 
 export default {
 export default {

+ 13 - 4
client/themes/default/components/page.vue

@@ -106,7 +106,7 @@
                     span 334
                     span 334
                 .d-flex
                 .d-flex
                   v-btn.text-none(
                   v-btn.text-none(
-                    :href='"/c/" + locale + "/" + path'
+                    @click='goToComments'
                     :color='$vuetify.theme.dark ? `pink` : `pink darken-3`'
                     :color='$vuetify.theme.dark ? `pink` : `pink darken-3`'
                     outlined
                     outlined
                     style='flex: 1 1 100%;'
                     style='flex: 1 1 100%;'
@@ -116,7 +116,7 @@
                   v-tooltip(right, v-if='isAuthenticated')
                   v-tooltip(right, v-if='isAuthenticated')
                     template(v-slot:activator='{ on }')
                     template(v-slot:activator='{ on }')
                       v-btn.ml-2(
                       v-btn.ml-2(
-                        :href='"/c/" + locale + "/" + path + `?new`'
+                        @click='goToComments(true)'
                         v-on='on'
                         v-on='on'
                         outlined
                         outlined
                         small
                         small
@@ -398,9 +398,9 @@ export default {
       type: Boolean,
       type: Boolean,
       default: false
       default: false
     },
     },
-    commentsProvider: {
+    commentsPermissions: {
       type: String,
       type: String,
-      default: 'default'
+      default: ''
     },
     },
     commentsExternal: {
     commentsExternal: {
       type: Boolean,
       type: Boolean,
@@ -485,6 +485,9 @@ export default {
     this.$store.set('page/tags', this.tags)
     this.$store.set('page/tags', this.tags)
     this.$store.set('page/title', this.title)
     this.$store.set('page/title', this.title)
     this.$store.set('page/updatedAt', this.updatedAt)
     this.$store.set('page/updatedAt', this.updatedAt)
+    if (this.commentsPermissions) {
+      this.$store.set('page/comments', JSON.parse(atob(this.commentsPermissions)))
+    }
 
 
     this.$store.set('page/mode', 'view')
     this.$store.set('page/mode', 'view')
   },
   },
@@ -571,6 +574,12 @@ export default {
       } else {
       } else {
         this.navShown = false
         this.navShown = false
       }
       }
+    },
+    goToComments (focusNewComment = false) {
+      this.$vuetify.goTo('#discussion', this.scrollOpts)
+      if (focusNewComment) {
+        document.querySelector('#discussion-new').focus()
+      }
     }
     }
   }
   }
 }
 }