SelectorBlocks.vue 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. <template>
  2. <div class="events mt-4">
  3. <div class="flex items-center">
  4. <ui-select
  5. v-model="state.selectedBlock"
  6. class="flex-1 mr-4 p-0.5"
  7. placeholder="Select block"
  8. @change="onSelectChanged"
  9. >
  10. <option v-for="(block, id) in blocks" :key="id" :value="id">
  11. {{ block.name }}
  12. </option>
  13. </ui-select>
  14. <ui-button
  15. :disabled="!state.selectedBlock"
  16. variant="accent"
  17. @click="executeBlock"
  18. >
  19. Execute
  20. </ui-button>
  21. </div>
  22. <component
  23. :is="blocks[state.selectedBlock].component"
  24. v-if="state.selectedBlock && blocks[state.selectedBlock].component"
  25. :data="state.params"
  26. :hide-base="true"
  27. @update:data="updateParams"
  28. />
  29. <pre
  30. v-if="state.blockResult"
  31. class="p-2 rounded-lg text-gray-100 bg-accent h-full mt-2 overflow-auto text-sm"
  32. >{{ state.blockResult }}</pre
  33. >
  34. </div>
  35. </template>
  36. <script setup>
  37. import { shallowReactive } from 'vue';
  38. import { tasks } from '@/utils/shared';
  39. import EditForms from '@/components/newtab/workflow/edit/EditForms.vue';
  40. import EditTriggerEvent from '@/components/newtab/workflow/edit/EditTriggerEvent.vue';
  41. import EditScrollElement from '@/components/newtab/workflow/edit/EditScrollElement.vue';
  42. import handleForms from '@/content/blocksHandler/handlerForms';
  43. import handleGetText from '@/content/blocksHandler/handlerGetText';
  44. import handleEventClick from '@/content/blocksHandler/handlerEventClick';
  45. import handelTriggerEvent from '@/content/blocksHandler/handlerTriggerEvent';
  46. import handleElementScroll from '@/content/blocksHandler/handlerElementScroll';
  47. const props = defineProps({
  48. selector: {
  49. type: String,
  50. default: '',
  51. },
  52. elements: {
  53. type: Array,
  54. default: () => [],
  55. },
  56. });
  57. const emit = defineEmits(['update', 'execute']);
  58. const blocks = {
  59. forms: {
  60. ...tasks.forms,
  61. component: EditForms,
  62. handler: handleForms,
  63. },
  64. 'get-text': {
  65. ...tasks['get-text'],
  66. component: '',
  67. handler: handleGetText,
  68. },
  69. 'event-click': {
  70. ...tasks['event-click'],
  71. component: '',
  72. handler: handleEventClick,
  73. },
  74. 'trigger-event': {
  75. ...tasks['trigger-event'],
  76. component: EditTriggerEvent,
  77. handler: handelTriggerEvent,
  78. },
  79. 'element-scroll': {
  80. ...tasks['element-scroll'],
  81. component: EditScrollElement,
  82. handler: handleElementScroll,
  83. },
  84. };
  85. const state = shallowReactive({
  86. params: {},
  87. blockResult: '',
  88. selectedBlock: '',
  89. });
  90. function updateParams(data = {}) {
  91. state.params = data;
  92. emit('update');
  93. }
  94. function onSelectChanged(value) {
  95. state.params = tasks[value].data;
  96. state.blockResult = '';
  97. emit('update');
  98. }
  99. function executeBlock() {
  100. const params = {
  101. ...state.params,
  102. selector: props.selector,
  103. multiple: props.elements.length > 1,
  104. };
  105. emit('execute', true);
  106. blocks[state.selectedBlock].handler({ data: params }).then((result) => {
  107. state.blockResult = JSON.stringify(result, null, 2).trim();
  108. emit('update');
  109. emit('execute', false);
  110. });
  111. }
  112. </script>