index.vue 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. <template>
  2. <div>
  3. <instructor-header title="Create your courses">
  4. <template #actionMenu>
  5. <div class="full-page-takeover-header-button">
  6. <nuxt-link
  7. to="/instructor/course/create"
  8. class="button is-medium is-light">
  9. New Course
  10. </nuxt-link>
  11. <nuxt-link
  12. to="/"
  13. class="button is-danger is-medium is-inverted is-outlined">
  14. Student
  15. </nuxt-link>
  16. </div>
  17. </template>
  18. </instructor-header>
  19. <div class="courses-page">
  20. <div class="container">
  21. <div class="columns">
  22. <div class="column is-8 is-offset-2">
  23. <h1 class="courses-page-title">Your Courses</h1>
  24. <!-- Iterate Courses -->
  25. <div
  26. v-for="course in courses"
  27. :key="course._id"
  28. class="tile is-ancestor">
  29. <div class="tile is-parent is-12">
  30. <!-- Navigate to course manage page -->
  31. <nuxt-link :to="`/instructor/course/${course._id}/manage`" class="tile tile-overlay-container is-child box">
  32. <div class="tile-overlay">
  33. <span class="tile-overlay-text">
  34. Update Course
  35. </span>
  36. </div>
  37. <div class="columns">
  38. <div class="column is-narrow">
  39. <figure class="image is-4by2 is-128x128">
  40. <img :src="course.image || 'https://via.placeholder.com/150'">
  41. </figure>
  42. </div>
  43. <div class="column">
  44. <p class="title">{{course.title}}</p>
  45. <p class="subtitle">{{course.subtitle || 'No subtitle provided yet'}}</p>
  46. <span class="tag"
  47. :class="createStatusClass(course.status)">Published</span>
  48. </div>
  49. <div class="column is-narrow flex-centered">
  50. <div class="price-title">
  51. {{course.price || 0}} $
  52. </div>
  53. </div>
  54. </div>
  55. </nuxt-link>
  56. </div>
  57. </div>
  58. </div>
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. </template>
  64. <script>
  65. import InstructorHeader from '~/components/shared/Header'
  66. export default {
  67. layout: 'instructor',
  68. components: {
  69. InstructorHeader
  70. },
  71. computed : {
  72. courses(){
  73. return this.$store.state.instructor.course.items
  74. }
  75. },
  76. async fetch({store}){
  77. console.log('courses/index.vue fetch call')
  78. const result = await store.dispatch('instructor/course/fetchInstructorCourses')
  79. console.log('courses/index.vue fetch done', result)
  80. },
  81. methods: {
  82. createStatusClass(status) {
  83. if (!status) return ''
  84. if (status === 'published') return 'is-success'
  85. if (status === 'active') return 'is-primary'
  86. if (status === 'inactive') return 'is-warning'
  87. if (status === 'deleted') return 'is-danger'
  88. }
  89. }
  90. }
  91. </script>
  92. <style scoped lang="scss">
  93. .tile-image {
  94. float: left;
  95. }
  96. .price-title {
  97. font-size: 40px;
  98. font-weight: bold;
  99. }
  100. .flex-centered {
  101. align-items: center;
  102. justify-content: flex-end;
  103. display: flex;
  104. }
  105. .tile-overlay-container {
  106. position: relative;
  107. &:hover {
  108. box-shadow: none;
  109. }
  110. &:hover > .tile-overlay {
  111. background-color: rgba(255,255,255,.9);
  112. }
  113. &:hover .tile-overlay-text {
  114. visibility: visible;
  115. }
  116. .tile-overlay {
  117. position: absolute;
  118. display: block;
  119. height: auto;
  120. bottom: 0;
  121. width: auto;
  122. right: 0;
  123. top: 0;
  124. left: 0;
  125. z-index: 2;
  126. cursor: pointer;
  127. &-text {
  128. color: #58529f;
  129. visibility: hidden;
  130. position: absolute;
  131. top: 0;
  132. left: 0;
  133. width: 100%;
  134. height: 100%;
  135. font-size: 18px;
  136. white-space: pre-wrap;
  137. display: flex;
  138. flex-direction: row;
  139. align-items: center;
  140. justify-content: center;
  141. font-size: 30px;
  142. font-weight: 700;
  143. white-space: nowrap;
  144. }
  145. }
  146. }
  147. .courses-page {
  148. padding-top: 60px;
  149. &-title {
  150. font-size: 40px;
  151. font-weight: bold;
  152. padding-bottom: 20px;
  153. }
  154. }
  155. </style>