WorkflowDetailsCard.vue 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. <template>
  2. <div class="px-4 flex items-center mb-2 mt-1">
  3. <ui-popover class="mr-2 h-6">
  4. <template #trigger>
  5. <span title="Workflow icon" class="cursor-pointer">
  6. <v-remixicon :name="workflow.icon" size="26" />
  7. </span>
  8. </template>
  9. <p class="mb-2">Workflow icon</p>
  10. <div class="grid grid-cols-4 gap-1">
  11. <span
  12. v-for="icon in icons"
  13. :key="icon"
  14. class="cursor-pointer rounded-lg inline-block p-2 hoverable"
  15. @click="$emit('update', { icon })"
  16. >
  17. <v-remixicon :name="icon" />
  18. </span>
  19. </div>
  20. </ui-popover>
  21. <p class="font-semibold text-overflow inline-block text-lg flex-1 mr-4">
  22. {{ workflow.name }}
  23. </p>
  24. </div>
  25. <ui-input
  26. v-model="query"
  27. prepend-icon="riSearch2Line"
  28. class="px-4 mt-4 mb-2"
  29. placeholder="Search blocks"
  30. />
  31. <div class="scroll bg-scroll overflow-auto px-4 flex-1 overflow-auto">
  32. <template v-for="(items, catId) in taskList" :key="catId">
  33. <div class="flex items-center top-0 space-x-2 mb-2">
  34. <span
  35. :class="categories[catId].color"
  36. class="h-3 w-3 rounded-full"
  37. ></span>
  38. <p class="capitalize text-gray-600">{{ categories[catId].name }}</p>
  39. </div>
  40. <div class="grid grid-cols-2 gap-2 mb-4">
  41. <div
  42. v-for="block in items"
  43. :key="block.id"
  44. :title="block.description || block.name"
  45. draggable="true"
  46. class="
  47. transform
  48. select-none
  49. cursor-move
  50. relative
  51. p-4
  52. rounded-lg
  53. bg-input
  54. transition
  55. "
  56. @dragstart="
  57. $event.dataTransfer.setData('block', JSON.stringify(block))
  58. "
  59. >
  60. <a
  61. v-if="block.docs"
  62. :href="`https://github.com/Kholid060/automa/wiki/Blocks#${block.id}`"
  63. target="_blank"
  64. title="Documentation"
  65. rel="noopener"
  66. class="absolute top-px right-2"
  67. >
  68. &#128712;
  69. </a>
  70. <v-remixicon :name="block.icon" size="24" class="mb-2" />
  71. <p class="leading-tight text-overflow">
  72. {{ block.name }}
  73. </p>
  74. </div>
  75. </div>
  76. </template>
  77. </div>
  78. </template>
  79. <script setup>
  80. import { computed, ref } from 'vue';
  81. import { tasks, categories } from '@/utils/shared';
  82. defineProps({
  83. workflow: {
  84. type: Object,
  85. default: () => ({}),
  86. },
  87. dataChanged: {
  88. type: Boolean,
  89. default: false,
  90. },
  91. });
  92. defineEmits(['update']);
  93. const icons = [
  94. 'riGlobalLine',
  95. 'riFileTextLine',
  96. 'riEqualizerLine',
  97. 'riTimerLine',
  98. 'riCalendarLine',
  99. 'riFlashlightLine',
  100. 'riLightbulbFlashLine',
  101. 'riDatabase2Line',
  102. 'riWindowLine',
  103. 'riCursorLine',
  104. 'riDownloadLine',
  105. 'riCommandLine',
  106. ];
  107. const query = ref('');
  108. const taskList = computed(() =>
  109. Object.keys(tasks).reduce((arr, key) => {
  110. const task = tasks[key];
  111. if (tasks[key].name.toLowerCase().includes(query.value.toLowerCase())) {
  112. (arr[task.category] = arr[task.category] || []).push({
  113. id: key,
  114. ...task,
  115. });
  116. }
  117. return arr;
  118. }, {})
  119. );
  120. </script>