EventList.vue 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <div>
  3. <v-list height="420">
  4. <v-list-item v-for="event in events" :key="event.id" class="event-item">
  5. <template #prepend>
  6. <v-avatar color="grey-lighten-1">
  7. <UiImage :image-id="event.image" :width="50" />
  8. </v-avatar>
  9. </template>
  10. <template #default>
  11. <div class="flex-grow-1" @click="$emit('edit', event.id)">
  12. <span class="text-subtitle-1">{{ event.name }}</span>
  13. <br />
  14. <span class="text-subtitle-2">{{
  15. date.format(event.datetimeStart, 'fullDateWithWeekday')
  16. }}</span>
  17. </div>
  18. </template>
  19. <template #append>
  20. <v-avatar
  21. class="edit-btn action-btn"
  22. @click="$emit('edit', event.id)"
  23. >
  24. <v-icon>fas fa-pencil</v-icon>
  25. </v-avatar>
  26. <UiButtonDelete :entity="event" class="delete-btn action-btn">
  27. <v-avatar>
  28. <v-icon>fas fa-trash</v-icon>
  29. </v-avatar>
  30. </UiButtonDelete>
  31. </template>
  32. </v-list-item>
  33. </v-list>
  34. <div
  35. v-if="events.length > 0"
  36. class="d-flex justify-space-between px-4 py-2 pagination mb-5"
  37. >
  38. <v-btn
  39. variant="flat"
  40. class="pagination-btn"
  41. :disabled="!pagination.first || !pagination.previous"
  42. @click="$emit('load', pagination.first)"
  43. >
  44. <v-avatar>
  45. <v-icon>fas fa-angles-left</v-icon>
  46. </v-avatar>
  47. </v-btn>
  48. <v-btn
  49. variant="flat"
  50. class="pagination-btn"
  51. :disabled="!pagination.previous"
  52. @click="$emit('load', pagination.previous)"
  53. >
  54. <v-avatar>
  55. <v-icon>fas fa-angle-left</v-icon>
  56. </v-avatar>
  57. </v-btn>
  58. <v-btn
  59. variant="flat"
  60. class="pagination-btn"
  61. :disabled="!pagination.next"
  62. @click="$emit('load', pagination.next)"
  63. >
  64. <v-avatar>
  65. <v-icon>fas fa-angle-right</v-icon>
  66. </v-avatar>
  67. </v-btn>
  68. <v-btn
  69. variant="flat"
  70. class="pagination-btn"
  71. :disabled="pagination.last == 1"
  72. @click="$emit('load', pagination.last)"
  73. >
  74. <v-avatar>
  75. <v-icon>fas fa-angles-right</v-icon>
  76. </v-avatar>
  77. </v-btn>
  78. </div>
  79. </div>
  80. </template>
  81. <script lang="ts" setup>
  82. import { defineProps, defineEmits } from 'vue'
  83. import type { Collection } from 'pinia-orm'
  84. import type Event from '~/models/Freemium/Event'
  85. import type { Pagination } from '~/types/data'
  86. import { useDate } from 'vuetify'
  87. const props = defineProps<{
  88. events: Collection<Event>
  89. pagination: Pagination
  90. }>()
  91. const emits = defineEmits(['edit', 'load'])
  92. const date = useDate()
  93. </script>
  94. <style scoped lang="scss">
  95. .event-item {
  96. margin-top: 20px;
  97. color: rgb(var(--v-theme-on-neutral));
  98. .text-subtitle-2 {
  99. text-transform: capitalize !important;
  100. color: rgb(var(--v-theme-on-neutral--sub));
  101. }
  102. }
  103. .pagination-btn[disabled] {
  104. opacity: 0.3;
  105. }
  106. .edit-btn {
  107. cursor: pointer;
  108. }
  109. .action-btn:hover {
  110. background-color: rgb(var(--v-theme-on-neutral-soft--sub));
  111. border-radius: 20px;
  112. }
  113. :deep(.v-list-item):hover {
  114. cursor: pointer;
  115. background-color: rgb(var(--v-theme-neutral-soft));
  116. }
  117. </style>