BlogEdit.vue 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178
  1. <template>
  2. <b-card v-if="Object.keys(blogEdit).length" class="blog-edit-wrapper">
  3. <!-- media -->
  4. <b-media no-body vertical-align="center">
  5. <b-media-aside class="mr-75">
  6. <b-avatar size="38" :src="getUserAvatar(blogEdit.userId)" />
  7. </b-media-aside>
  8. <b-media-body>
  9. <h6 class="mb-25">
  10. {{ blogEdit.userFullName }}
  11. </h6>
  12. <b-card-text>{{ dateFormat(blogEdit.createdTime) }}</b-card-text>
  13. </b-media-body>
  14. </b-media>
  15. <!--/ media -->
  16. <!-- form -->
  17. <b-form class="mt-2">
  18. <b-row>
  19. <b-col md="6">
  20. <b-form-group label="Title" label-for="blog-edit-title" class="mb-2">
  21. <b-form-input id="blog-edit-title" v-model="blogEdit.blogTitle" />
  22. </b-form-group>
  23. </b-col>
  24. <b-col md="6">
  25. <b-form-group label="Category" label-for="blog-edit-category" class="mb-2">
  26. <v-select id="blog-edit-category" v-model="blogEdit.blogCategories"
  27. :dir="$store.state.appConfig.isRTL ? 'rtl' : 'ltr'" multiple :options="categoryOption" />
  28. </b-form-group>
  29. </b-col>
  30. <b-col cols="12">
  31. <b-form-group label="Content" label-for="blog-content" class="mb-2">
  32. <quill-editor id="blog-content" v-model="blogEdit.excerpt" :options="snowOption" />
  33. </b-form-group>
  34. </b-col>
  35. <b-col cols="12" class="mb-2">
  36. <div class="border rounded p-2">
  37. <h4 class="mb-1">
  38. Featured Image
  39. </h4>
  40. <b-media no-body vertical-align="center" class="flex-column flex-md-row">
  41. <b-media-aside>
  42. <b-img ref="refPreviewEl" :src="blogEdit.featuredImage" height="110" width="170"
  43. class="rounded mr-2 mb-1 mb-md-0" />
  44. </b-media-aside>
  45. <b-media-body>
  46. <small class="text-muted">Required image resolution 800x400, image size 10mb.</small>
  47. <b-card-text class="my-50">
  48. <b-link id="blog-image-text">
  49. C:\fakepath\{{ blogFile ? blogFile.name : 'banner.jpg' }}
  50. </b-link>
  51. </b-card-text>
  52. <div class="d-inline-block">
  53. <b-form-file ref="refInputEl" v-model="blogFile" accept=".jpg, .png, .gif" placeholder="Choose file"
  54. @input="inputImageRenderer" />
  55. </div>
  56. </b-media-body>
  57. </b-media>
  58. </div>
  59. </b-col>
  60. <b-col cols="12" class="mt-50">
  61. <b-button v-ripple.400="'rgba(255, 255, 255, 0.15)'" variant="primary" class="mr-1" @click="saveChanges">
  62. Save Changes
  63. </b-button>
  64. <b-link :to="{ name: 'blog-detail', params: { id: blogId } }">
  65. <b-button v-ripple.400="'rgba(186, 191, 199, 0.15)'" variant="outline-secondary">
  66. Cancel
  67. </b-button>
  68. </b-link>
  69. </b-col>
  70. </b-row>
  71. </b-form>
  72. <!--/ form -->
  73. </b-card>
  74. </template>
  75. <script>
  76. import {
  77. BCard,
  78. BMedia,
  79. BAvatar,
  80. BCardText,
  81. BMediaAside,
  82. BMediaBody,
  83. BForm,
  84. BRow,
  85. BCol,
  86. BFormGroup,
  87. BFormInput,
  88. BImg,
  89. BFormFile,
  90. BLink,
  91. BButton,
  92. } from 'bootstrap-vue'
  93. import vSelect from 'vue-select'
  94. import { quillEditor } from 'vue-quill-editor'
  95. import Ripple from 'vue-ripple-directive'
  96. import { useInputImageRenderer } from '@core/comp-functions/forms/form-utils'
  97. import { ref } from '@vue/composition-api'
  98. import { getUserData } from '@/auth/utils';
  99. import useJwt from '@/auth/jwt/useJwt'
  100. import { format } from 'date-fns'
  101. import { zhTW } from 'date-fns/locale'
  102. export default {
  103. components: {
  104. BCard,
  105. BMedia,
  106. BAvatar,
  107. BCardText,
  108. BMediaAside,
  109. BMediaBody,
  110. BForm,
  111. BLink,
  112. BImg,
  113. BRow,
  114. BCol,
  115. BButton,
  116. BFormGroup,
  117. BFormInput,
  118. BFormFile,
  119. vSelect,
  120. quillEditor,
  121. },
  122. directives: {
  123. Ripple,
  124. },
  125. data() {
  126. return {
  127. blogId: this.$route.params.id,
  128. blogEdit: {},
  129. blogFile: null,
  130. categoryOption: ['Fashion', 'Food', 'Gaming', 'Quote', 'Video'],
  131. statusOption: ['Published', 'Pending', 'Draft'],
  132. snowOption: {
  133. theme: 'snow',
  134. },
  135. userData: getUserData(),
  136. }
  137. },
  138. created() {
  139. useJwt.getPost('/api/get_blog/edit', { blogId: this.blogId }).then(res => {
  140. this.blogEdit = res.data
  141. })
  142. },
  143. setup() {
  144. const refInputEl = ref(null)
  145. const refPreviewEl = ref(null)
  146. const { inputImageRenderer } = useInputImageRenderer(refInputEl, base64 => {
  147. refPreviewEl.value.src = base64
  148. })
  149. return {
  150. refInputEl,
  151. refPreviewEl,
  152. inputImageRenderer,
  153. }
  154. },
  155. methods: {
  156. dateFormat(date) {
  157. return format(new Date(date), 'yyyy-MM-dd hh:mm', { locale: zhTW })
  158. },
  159. getUserAvatar(userId) {
  160. return require('@/assets/images/avatars/' + userId + '-small.png')
  161. },
  162. saveChanges() {
  163. console.log(this.blogEdit.excerpt)
  164. }
  165. },
  166. }
  167. </script>
  168. <style lang="scss">
  169. @import '~@resources/scss/vue/libs/vue-select.scss';
  170. @import '~@resources/scss/vue/libs/quill.scss';
  171. @import '~@resources/scss/vue/pages/page-blog.scss';
  172. </style>