SharedCard.vue 1.9 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. <template>
  2. <ui-card class="hover:ring-2 group hover:ring-accent">
  3. <div class="flex items-center mb-4">
  4. <span class="p-2 rounded-lg bg-box-transparent">
  5. <v-remixicon :name="data.icon || icon" />
  6. </span>
  7. <div class="flex-grow"></div>
  8. <button
  9. class="invisible group-hover:visible"
  10. @click="$emit('execute', data)"
  11. >
  12. <v-remixicon name="riPlayLine" />
  13. </button>
  14. <ui-popover v-if="showDetails" class="h-6 ml-2">
  15. <template #trigger>
  16. <button>
  17. <v-remixicon name="riMoreLine" />
  18. </button>
  19. </template>
  20. <ui-list class="w-36 space-y-1">
  21. <ui-list-item
  22. v-for="item in menu"
  23. :key="item.name"
  24. v-close-popover
  25. class="cursor-pointer"
  26. @click="$emit('menuSelected', { name: item.name, data })"
  27. >
  28. <v-remixicon :name="item.icon" class="mr-2 -ml-1" />
  29. <span class="capitalize">{{ item.name }}</span>
  30. </ui-list-item>
  31. </ui-list>
  32. </ui-popover>
  33. </div>
  34. <div class="cursor-pointer" @click="$emit('click', data)">
  35. <p class="line-clamp font-semibold leading-tight">
  36. {{ data.name }}
  37. </p>
  38. <p class="text-gray-600 dark:text-gray-200">{{ formatDate() }}</p>
  39. </div>
  40. </ui-card>
  41. </template>
  42. <script setup>
  43. import dayjs from '@/lib/dayjs';
  44. const props = defineProps({
  45. data: {
  46. type: Object,
  47. default: () => ({}),
  48. },
  49. icon: {
  50. type: String,
  51. default: 'riGlobalLine',
  52. },
  53. showDetails: {
  54. type: Boolean,
  55. default: true,
  56. },
  57. menu: {
  58. type: Array,
  59. default: () => [],
  60. },
  61. });
  62. defineEmits(['execute', 'click', 'menuSelected']);
  63. let formattedDate = null;
  64. const formatDate = () => {
  65. if (formattedDate) return formattedDate;
  66. formattedDate = dayjs(props.data.createdAt).fromNow();
  67. return formattedDate;
  68. };
  69. </script>