LastEvents.vue 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. <template>
  2. <div class="eventCarousel">
  3. <div class="eventCarousel-title">
  4. <div>
  5. <q-banner class="banner">
  6. آخرین
  7. رویدادها
  8. </q-banner>
  9. </div>
  10. <div>
  11. <q-btn flat
  12. :to="{name: 'Public.AllEvents'}">
  13. مشاهده همه
  14. <svg xmlns="http://www.w3.org/2000/svg"
  15. width="18.387"
  16. height="11.502"
  17. viewBox="0 0 18.387 11.502"
  18. class="q-ml-sm">
  19. <path id="Combined_Shape"
  20. data-name="Combined Shape"
  21. d="M-9.338,11.408a.748.748,0,0,0,.388-.656V6.5h8.2A.751.751,0,0,0,0,5.75.75.75,0,0,0-.75,5h-8.2V.75A.751.751,0,0,0-9.338.093.769.769,0,0,0-9.7,0a.735.735,0,0,0-.4.115l-7.938,5a.747.747,0,0,0-.35.635.742.742,0,0,0,.35.634l7.938,5a.751.751,0,0,0,.4.116A.746.746,0,0,0-9.338,11.408ZM-10.45,9.392l-5.78-3.641,5.78-3.642Z"
  22. transform="translate(18.387)"
  23. fill="#eac38a" />
  24. </svg>
  25. </q-btn>
  26. </div>
  27. </div>
  28. <div class="carousel-section">
  29. <div v-if="!events.loading && events.list.length > 0"
  30. ref="slider"
  31. class="splide"
  32. role="group"
  33. aria-label="Splide Basic HTML Example">
  34. <div class="splide__track">
  35. <ul class="splide__list">
  36. <li v-for="(event, eventIndex) in events.list"
  37. :key="eventIndex"
  38. class="splide__slide">
  39. <event-item :event="event" />
  40. </li>
  41. </ul>
  42. </div>
  43. </div>
  44. <div v-else-if="!events.loading && events.list.length === 0">
  45. رویدادی یافت نشد.
  46. </div>
  47. <div v-else-if="events.loading">
  48. کمی صبر کنید ...
  49. </div>
  50. </div>
  51. </div>
  52. </template>
  53. <script>
  54. import Splide from '@splidejs/splide'
  55. import { User } from 'src/models/User.js'
  56. import ShamsiDate from 'src/assets/ShamsiDate.js'
  57. import { APIGateway } from 'src/api/APIGateway.js'
  58. import EventItem from 'src/components/EventItem.vue'
  59. import '@splidejs/splide/dist/css/splide-core.min.css'
  60. import { mixinPrefetchServerData } from 'src/mixin/Mixins.js'
  61. import { Classroom, ClassroomList } from 'src/models/Classroom.js'
  62. import { EventRegistrationList } from 'src/models/EventRegistration.js'
  63. export default {
  64. name: 'EventCarousel',
  65. components: {
  66. EventItem
  67. },
  68. mixins: [mixinPrefetchServerData],
  69. data () {
  70. return {
  71. loading: false,
  72. user: new User(),
  73. userRegistrations: new EventRegistrationList(),
  74. slider: null,
  75. events: new ClassroomList(),
  76. breakpoints: {
  77. 1920: {
  78. perPage: 3
  79. },
  80. 900: {
  81. perPage: 2
  82. },
  83. 500: {
  84. perPage: 1
  85. }
  86. },
  87. maximizedToggle: true,
  88. dialog: false
  89. }
  90. },
  91. mounted () {
  92. this.loadAuthData()
  93. this.loadSlider()
  94. if (this.user && this.user.id !== null) {
  95. this.getUserRegistrations()
  96. }
  97. },
  98. methods: {
  99. loadSlider () {
  100. this.$nextTick(() => {
  101. if (!this.$refs.slider) {
  102. return
  103. }
  104. new Splide(this.$refs.slider, {
  105. direction: 'rtl',
  106. paginationDirection: 'rtl',
  107. // type: 'loop',
  108. focus: 0,
  109. gap: 24,
  110. snap: true,
  111. // focus: 'center',
  112. breakpoints: this.breakpoints
  113. }).mount()
  114. })
  115. },
  116. getHoldingType (event) {
  117. return new Classroom(event).holding_type_info.label
  118. },
  119. prefetchServerDataPromise () {
  120. return this.getEvents()
  121. },
  122. prefetchServerDataPromiseThen (eventList) {
  123. this.events = new ClassroomList(eventList.list)
  124. this.events.loading = false
  125. this.loadSlider()
  126. },
  127. prefetchServerDataPromiseCatch () {
  128. this.events.loading = false
  129. },
  130. loadAuthData () {
  131. this.user = this.$store.getters['Auth/user']
  132. },
  133. getTerm (event) {
  134. if (!event.beginning_registration_period) {
  135. return '-'
  136. }
  137. return ShamsiDate.getTerm(event.beginning_registration_period)
  138. },
  139. isEventRegistered (eventId) {
  140. return !!this.userRegistrations.list.find(item => item.event === eventId && (item.status === 'REGISTERED' || item.status === 'ENROLLED'))
  141. },
  142. getUserRegistrations () {
  143. this.userRegistrations.loading = true
  144. APIGateway.classroomRegistration.index()
  145. .then((eventRegistrationList) => {
  146. this.userRegistrations = new EventRegistrationList(eventRegistrationList.list)
  147. this.userRegistrations.loading = false
  148. })
  149. .catch(() => {
  150. this.userRegistrations.loading = false
  151. })
  152. },
  153. getEvents () {
  154. this.events.loading = true
  155. // return APIGateway.event.index()
  156. return APIGateway.classroom.index({
  157. unit__category__type: 'EVENT',
  158. per_page: 9999
  159. })
  160. }
  161. }
  162. }
  163. </script>
  164. <style scoped lang="scss">
  165. .eventCarousel {
  166. padding: 60px 0;
  167. .eventCarousel-title {
  168. display: flex;
  169. flex-flow: row;
  170. justify-content: space-between;
  171. padding-bottom: 33px;
  172. }
  173. .carousel-section {
  174. }
  175. }
  176. </style>