index.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. <template>
  2. <div>
  3. <Header
  4. title="Manage your Blogs"
  5. exitLink="/"
  6. />
  7. <div class="instructor-blogs">
  8. <div class="container">
  9. <div class="section">
  10. <div class="header-block">
  11. <h2>Your Stories</h2>
  12. <div class="title-menu">
  13. <button @click="$router.push('/instructor/blog/editor')" class="button">Write a story</button>
  14. </div>
  15. </div>
  16. <div class="tabs">
  17. <ul>
  18. <!-- set here active tab -->
  19. <li @click="activeTab = 0">
  20. <a :class="{'is-active': activeTab === 0}">Drafts</a>
  21. </li>
  22. <!-- set here active tab -->
  23. <li @click="activeTab = 1">
  24. <a :class="{'is-active': activeTab === 1}">Published</a>
  25. </li>
  26. </ul>
  27. </div>
  28. <div class="blogs-container">
  29. <template v-if="activeTab === 0">
  30. <div v-if="drafts && drafts.length > 0">
  31. <div
  32. v-for="dBlog in drafts"
  33. :key="dBlog._id"
  34. class="blog-card">
  35. <h2>{{dBlog.title}}</h2>
  36. <div class="blog-card-footer">
  37. <span>
  38. Last Edited {{dBlog.updatedAt | formatDate('LLLL')}}
  39. </span>
  40. <dropdown :items="draftsOptions" />
  41. <!-- Dropdown with menu here -->
  42. </div>
  43. </div>
  44. </div>
  45. <!-- In case of no drafts blogs -->
  46. <div v-else class="blog-error">
  47. No Drafts :(
  48. </div>
  49. </template>
  50. <template v-if="activeTab === 1">
  51. <div v-if="published && published.length > 0">
  52. <div
  53. v-for="pBlog in published"
  54. :key="pBlog._id"
  55. class="blog-card">
  56. <h2>{{pBlog.title}}</h2>
  57. <div class="blog-card-footer">
  58. <span>
  59. Last Edited {{pBlog.updatedAt | formatDate('LLLL')}}
  60. </span>
  61. <dropdown :items="publishedOptions" />
  62. <!-- Dropdown with menu here -->
  63. </div>
  64. </div>
  65. </div>
  66. <!-- In case of no drafts blogs -->
  67. <div v-else class="blog-error">
  68. No Drafts :(
  69. </div>
  70. </template>
  71. </div>
  72. </div>
  73. </div>
  74. </div>
  75. </div>
  76. </template>
  77. <script>
  78. import Header from '~/components/shared/Header'
  79. import Dropdown from '~/components/shared/Dropdown'
  80. import { createPublishedOptions, createDraftsOptions } from '~/pages/instructor/options'
  81. import { mapState } from 'vuex';
  82. export default {
  83. layout: 'instructor',
  84. components: {Header, Dropdown},
  85. data() {
  86. return {
  87. activeTab: 0
  88. }
  89. },
  90. computed: {
  91. ...mapState({
  92. published : ({instructor}) => instructor.blog.items.published,
  93. drafts : ({instructor}) => instructor.blog.items.drafts,
  94. }),
  95. publishedOptions() {
  96. return createPublishedOptions()
  97. },
  98. draftsOptions() {
  99. return createDraftsOptions()
  100. }
  101. },
  102. async fetch({store}) {
  103. await store.dispatch('instructor/blog/fetchUserBlogs')
  104. }
  105. }
  106. </script>
  107. <style scoped lang="scss">
  108. .is-active {
  109. border-bottom-color: #363636;
  110. color: #363636;
  111. }
  112. .blog-error {
  113. font-size: 35px;
  114. }
  115. .blog-card {
  116. border-bottom: 1px solid rgba(0, 0, 0, 0.1);
  117. padding: 20px 0;
  118. > h2 {
  119. font-size: 30px;
  120. font-weight: bold;
  121. }
  122. &-footer {
  123. color: rgba(0, 0, 0, 0.54);
  124. }
  125. &.featured {
  126. border-left: 5px solid #3cc314;
  127. padding-left: 10px;
  128. transition: border ease-out 0.2s;
  129. }
  130. }
  131. .header-block {
  132. display: flex;
  133. flex-direction: row;
  134. align-items: center;
  135. > h2 {
  136. font-size: 40px;
  137. font-weight: bold;
  138. }
  139. .title-menu {
  140. margin-left: auto;
  141. }
  142. }
  143. </style>