WorkflowsHosted.vue 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970
  1. <template>
  2. <shared-card
  3. v-for="workflow in workflows"
  4. :key="workflow.hostId"
  5. :data="workflow"
  6. :menu="menu"
  7. @execute="executeWorkflow(workflow)"
  8. @click="$router.push(`/workflows/${$event.hostId}/host`)"
  9. @menuSelected="deleteWorkflow(workflow)"
  10. />
  11. </template>
  12. <script setup>
  13. import { computed } from 'vue';
  14. import { useI18n } from 'vue-i18n';
  15. import { useWorkflowStore } from '@/stores/workflow';
  16. import { useDialog } from '@/composable/dialog';
  17. import { arraySorter } from '@/utils/helper';
  18. import { cleanWorkflowTriggers } from '@/utils/workflowTrigger';
  19. import SharedCard from '@/components/newtab/shared/SharedCard.vue';
  20. const props = defineProps({
  21. search: {
  22. type: String,
  23. default: '',
  24. },
  25. sort: {
  26. type: Object,
  27. default: () => ({
  28. by: '',
  29. order: '',
  30. }),
  31. },
  32. });
  33. const { t } = useI18n();
  34. const dialog = useDialog();
  35. const workflowStore = useWorkflowStore();
  36. const menu = [
  37. { id: 'delete', name: t('common.delete'), icon: 'riDeleteBin7Line' },
  38. ];
  39. const workflows = computed(() => {
  40. const filtered = Object.values(workflowStore.hosted).filter(({ name }) =>
  41. name.toLocaleLowerCase().includes(props.search.toLocaleLowerCase())
  42. );
  43. return arraySorter({
  44. data: filtered,
  45. key: props.sort.by,
  46. order: props.sort.order,
  47. });
  48. });
  49. async function deleteWorkflow(workflow) {
  50. dialog.confirm({
  51. title: t('workflow.delete'),
  52. okVariant: 'danger',
  53. body: t('message.delete', { name: workflow.name }),
  54. onConfirm: async () => {
  55. try {
  56. delete workflowStore.hosted[workflow.hostId];
  57. await cleanWorkflowTriggers(workflow.hostId);
  58. } catch (error) {
  59. console.error(error);
  60. }
  61. },
  62. });
  63. }
  64. </script>