浏览代码

feat: add resume last workflow loop option

Ahmad Kholid 3 年之前
父节点
当前提交
9d4f81a844

+ 18 - 5
src/background/workflow-engine/blocks-handler/handler-loop-data.js

@@ -49,13 +49,22 @@ async function loopData({ data, id, outputs }) {
       };
 
       const currLoopData = await getLoopData[data.loopThrough]();
+      let index = 0;
 
-      if (data.loopThrough !== 'numbers' && !Array.isArray(currLoopData)) {
-        throw new Error('invalid-loop-data');
+      if (data.loopThrough !== 'numbers') {
+        if (!Array.isArray(currLoopData)) {
+          throw new Error('invalid-loop-data');
+        }
+
+        if (data.resumeLastWorkflow) {
+          index = JSON.parse(localStorage.getItem(`index:${id}`)) || 0;
+        } else if (data.startIndex > 0) {
+          index = data.startIndex;
+        }
       }
 
       this.loopList[data.loopId] = {
-        index: 0,
+        index,
         blockId: id,
         id: data.loopId,
         data: currLoopData,
@@ -68,11 +77,15 @@ async function loopData({ data, id, outputs }) {
       /* eslint-disable-next-line */
       this.referenceData.loopData[data.loopId] = {
         data:
-          data.loopThrough === 'numbers' ? data.fromNumber : currLoopData[0],
-        $index: 0,
+          data.loopThrough === 'numbers'
+            ? data.fromNumber
+            : currLoopData[index],
+        $index: index,
       };
     }
 
+    localStorage.setItem(`index:${id}`, this.loopList[data.loopId].index);
+
     return {
       nextBlockId,
       data: this.referenceData.loopData[data.loopId],

+ 1 - 0
src/components/newtab/workflow/WorkflowBuilder.vue

@@ -401,6 +401,7 @@ export default {
           const newDrawflowData = Object.entries(
             data.drawflow.Home.data
           ).reduce((obj, [key, value]) => {
+            console.log(tasks[value.name], value.name);
             obj[key] = {
               ...value,
               html: tasks[value.name].component,

+ 28 - 10
src/components/newtab/workflow/edit/EditLoopData.vue

@@ -86,16 +86,34 @@
         "
       />
     </div>
-    <ui-input
-      v-if="data.loopThrough !== 'numbers'"
-      :model-value="data.maxLoop"
-      :label="t('workflow.blocks.loop-data.maxLoop.label')"
-      :title="t('workflow.blocks.loop-data.maxLoop.title')"
-      class="w-full mt-2"
-      min="0"
-      type="number"
-      @change="updateData({ maxLoop: +$event || 0 })"
-    />
+    <template v-if="data.loopThrough !== 'numbers'">
+      <ui-input
+        :model-value="data.maxLoop"
+        :label="t('workflow.blocks.loop-data.maxLoop.label')"
+        :title="t('workflow.blocks.loop-data.maxLoop.title')"
+        class="w-full mt-2"
+        min="0"
+        type="number"
+        @change="updateData({ maxLoop: +$event || 0 })"
+      />
+      <ui-input
+        v-if="!data.resumeLastWorkflow"
+        :model-value="data.startIndex"
+        :label="t('workflow.blocks.loop-data.startIndex')"
+        placeholder="0"
+        class="w-full mt-2"
+        min="0"
+        type="number"
+        @change="updateData({ startIndex: +$event || 0 })"
+      />
+      <ui-checkbox
+        :model-value="data.resumeLastWorkflow"
+        class="mt-1"
+        @change="updateData({ resumeLastWorkflow: $event })"
+      >
+        {{ t('workflow.blocks.loop-data.resumeLastWorkflow') }}
+      </ui-checkbox>
+    </template>
     <ui-modal
       v-model="state.showDataModal"
       title="Data"

+ 1 - 1
src/content/handle-selector.js

@@ -92,7 +92,7 @@ export default async function (
 
     if (data.multiple && selectorType === 'cssSelector') {
       await Promise.allSettled(
-        element.map((el) => {
+        Array.from(element).map((el) => {
           markElement(el, { id, data });
           return onSelected(el);
         })

+ 3 - 1
src/locales/en/blocks.json

@@ -145,7 +145,7 @@
           }
         },
         "refKey": {
-          "label": "Reference key",
+          "label": "Reference key (optional)",
           "placeholder": "Key name"
         },
         "spreadsheetId": {
@@ -406,6 +406,8 @@
         "description": "Iterate through table or your custom data",
         "loopId": "Loop id",
         "refKey": "Reference key",
+        "startIndex": "Start from index",
+        "resumeLastWorkflow": "Resume last workflow",
         "modal": {
           "fileTooLarge": "File too large to edit",
           "maxFile": "Max file size is 1MB",

+ 3 - 2
src/utils/shared.js

@@ -608,14 +608,15 @@ export const tasks = {
     data: {
       loopId: '',
       maxLoop: 0,
-      fromNumber: 1,
       toNumber: 10,
+      fromNumber: 1,
+      startIndex: 0,
       loopData: '[]',
       description: '',
       variableName: '',
       referenceKey: '',
       elementSelector: '',
-      specificRowAndCol: false,
+      resumeLastWorkflow: false,
       loopThrough: 'data-columns',
     },
   },