WorkflowCard.vue 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. <template>
  2. <ui-card class="hover:ring-accent hover:ring-2">
  3. <div class="mb-4 flex items-center">
  4. <span class="p-2 rounded-lg bg-box-transparent inline-block">
  5. <v-remixicon :name="workflow.icon" />
  6. </span>
  7. <div class="flex-grow"></div>
  8. <button @click="$emit('execute', workflow)">
  9. <v-remixicon name="riPlayLine" />
  10. </button>
  11. <ui-popover v-if="showDetails" class="ml-2 h-6">
  12. <template #trigger>
  13. <button>
  14. <v-remixicon name="riMoreLine" />
  15. </button>
  16. </template>
  17. <ui-list class="w-36 space-y-1">
  18. <ui-list-item
  19. v-for="item in menu"
  20. :key="item.name"
  21. v-close-popover
  22. class="cursor-pointer"
  23. @click="$emit(item.name, workflow)"
  24. >
  25. <v-remixicon :name="item.icon" class="mr-2 -ml-1" />
  26. <span class="capitalize">{{ item.name }}</span>
  27. </ui-list-item>
  28. </ui-list>
  29. </ui-popover>
  30. </div>
  31. <router-link :to="`/workflows/${workflow.id}`">
  32. <p class="line-clamp leading-tight font-semibold" :title="workflow.name">
  33. {{ workflow.name }}
  34. </p>
  35. <p class="text-gray-600 dark:text-gray-200 leading-tight text-overflow">
  36. {{ formatDate() }}
  37. </p>
  38. </router-link>
  39. </ui-card>
  40. </template>
  41. <script setup>
  42. import dayjs from '@/lib/dayjs';
  43. const props = defineProps({
  44. workflow: {
  45. type: Object,
  46. default: () => ({}),
  47. },
  48. showDetails: {
  49. type: Boolean,
  50. default: true,
  51. },
  52. });
  53. defineEmits(['delete', 'export', 'rename', 'execute']);
  54. const formatDate = () => dayjs(props.workflow.createdAt).fromNow();
  55. const menu = [
  56. { name: 'export', icon: 'riDownloadLine' },
  57. { name: 'rename', icon: 'riPencilLine' },
  58. { name: 'delete', icon: 'riDeleteBin7Line' },
  59. ];
  60. </script>