소스 검색

feat: add repeat-task handler

Ahmad Kholid 3 년 전
부모
커밋
6c361667e9

+ 18 - 0
src/background/blocks-handler.js

@@ -188,3 +188,21 @@ export function conditions({ data, outputs }, prevBlockData) {
     });
   });
 }
+
+export function repeatTask({ data, id, outputs }) {
+  return new Promise((resolve) => {
+    if (this.repeatedTasks[id] === data.repeatFor) {
+      resolve({
+        data: data.repeatFor,
+        nextBlockId: getBlockConnection({ outputs }),
+      });
+    } else {
+      this.repeatedTasks[id] = (this.repeatedTasks[id] || 0) + 1;
+
+      resolve({
+        data: data.repeatFor,
+        nextBlockId: getBlockConnection({ outputs }, 2),
+      });
+    }
+  });
+}

+ 1 - 0
src/background/workflow-engine.js

@@ -66,6 +66,7 @@ class WorkflowEngine {
     this.isInsidePaused = false;
     this.logs = [];
     this.currentBlock = null;
+    this.repeatedTasks = {};
 
     this.tabMessageListeners = {};
     this.tabUpdatedListeners = {};

+ 20 - 0
src/components/newtab/workflow/edit/EditScrollElement.vue

@@ -14,6 +14,26 @@
         @change="updateData({ scrollY: +$event })"
       />
     </div>
+    <div class="mt-3 space-y-2">
+      <ui-checkbox
+        :model-value="data.incX"
+        @change="updateData({ incX: $event })"
+      >
+        Increment horizontal scroll
+      </ui-checkbox>
+      <ui-checkbox
+        :model-value="data.incY"
+        @change="updateData({ incY: $event })"
+      >
+        Increment vertical scroll
+      </ui-checkbox>
+      <ui-checkbox
+        :model-value="data.smooth"
+        @change="updateData({ smooth: $event })"
+      >
+        Smooth scroll
+      </ui-checkbox>
+    </div>
   </edit-interaction-base>
 </template>
 <script setup>

+ 19 - 4
src/content/blocks-handler.js

@@ -63,10 +63,25 @@ export function getText(block) {
   });
 }
 
+function getScrollPos(element, data, vertical = true) {
+  let currentPos = vertical ? element.scrollTop : element.scrollLeft;
+
+  if (data.incY) {
+    currentPos += data.scrollY;
+  } else if (data.incX) {
+    currentPos += data.scrollX;
+  }
+
+  return currentPos;
+}
 export function elementScroll(block) {
   return new Promise((resolve) => {
     handleElement(block, (element) => {
-      element.scroll(block.data.scrollX, block.data.scrollY);
+      element.scroll({
+        top: getScrollPos(element, block.data),
+        left: getScrollPos(element, block.data, false),
+        behavior: block.data.smooth ? 'smooth' : 'auto',
+      });
     });
 
     window.dispatchEvent(new Event('scroll'));
@@ -92,7 +107,7 @@ export function attributeValue(block) {
 export function forms(block) {
   return new Promise((resolve) => {
     const { data } = block;
-    const elements = handleElement(data, true);
+    const elements = handleElement(block, true);
 
     if (data.multiple) {
       const promises = Array.from(elements).map((element) => {
@@ -107,7 +122,7 @@ export function forms(block) {
         resolve('');
       });
     } else if (elements) {
-      if (isElementUnique(element, block))
+      if (isElementUnique(elements, block))
         handleFormElement(elements, data, resolve);
     } else {
       resolve('');
@@ -145,7 +160,7 @@ export function link(block) {
 export function elementExists({ data }) {
   return new Promise((resolve) => {
     const element = document.querySelector(data.selector);
-
+    console.log('exists', element);
     resolve(!!element);
   });
 }

+ 1 - 0
src/lib/drawflow.js

@@ -12,6 +12,7 @@ export default function (element, ctx) {
   );
 
   editor.useuuid = true;
+  editor.reroute = true;
 
   blockComponents.keys().forEach((key) => {
     const name = key.replace(/(.\/)|\.vue$/g, '');

+ 5 - 1
src/utils/shared.js

@@ -1,4 +1,5 @@
-/* screenshot, assets, tab loaded, opened tab, and close tab block? */
+/* to-do screenshot, assets, tab loaded, opened tab, and close tab block? */
+/* to-do add timeout and trying to exists-element? */
 
 export const tasks = {
   trigger: {
@@ -99,6 +100,9 @@ export const tasks = {
       multiple: false,
       scrollY: 0,
       scrollX: 0,
+      incX: false,
+      incY: false,
+      smooth: false,
     },
   },
   link: {