Browse Source

feat: add max restart workflow

Ahmad Kholid 3 years ago
parent
commit
259804de71

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

@@ -359,12 +359,24 @@ class WorkflowEngine {
           this.executeBlock(this.blocks[error.nextBlockId], error.data || '');
         }, blockDelay);
       } else if (onError === 'restart-workflow' && !this.parentWorkflow) {
+        const restartKey = `restart-count:${this.id}`;
+        const restartCount = parseJSON(localStorage.getItem(restartKey), 0);
+        const maxRestart = this.workflow.settings.restartTimes ?? 3;
+
+        if (restartCount >= maxRestart) {
+          localStorage.removeItem(restartKey);
+          this.destroy();
+          return;
+        }
+
         this.reset();
 
         const triggerBlock = Object.values(this.blocks).find(
           ({ name }) => name === 'trigger'
         );
         this.executeBlock(triggerBlock);
+
+        localStorage.setItem(restartKey, restartCount + 1);
       } else {
         this.destroy('error', error.message);
       }

+ 29 - 10
src/components/newtab/workflow/WorkflowSettings.vue

@@ -1,14 +1,31 @@
 <template>
   <div class="workflow-settings">
-    <div class="mb-4">
-      <p class="mb-1 capitalize">
-        {{ t('workflow.settings.onError.title') }}
-      </p>
-      <ui-select v-model="settings.onError" class="w-full max-w-sm">
-        <option v-for="item in onError" :key="item.id" :value="item.id">
-          {{ t(`workflow.settings.onError.items.${item.name}`) }}
-        </option>
-      </ui-select>
+    <div class="mb-4 flex">
+      <div class="flex-1">
+        <p class="mb-1 capitalize">
+          {{ t('workflow.settings.onError.title') }}
+        </p>
+        <ui-select v-model="settings.onError" class="w-full max-w-sm">
+          <option v-for="item in onError" :key="item.id" :value="item.id">
+            {{ t(`workflow.settings.onError.items.${item.name}`) }}
+          </option>
+        </ui-select>
+      </div>
+      <label v-if="settings.onError === 'restart-workflow'" class="ml-2">
+        <p class="mb-1 capitalize">
+          {{ t('workflow.settings.restartWorkflow.for') }}
+        </p>
+        <div class="flex items-center bg-input transition-colors rounded-lg">
+          <input
+            v-model.number="settings.restartTimes"
+            type="number"
+            class="py-2 px-4 w-32 rounded-lg bg-transparent"
+          />
+          <span class="px-2">
+            {{ t('workflow.settings.restartWorkflow.times') }}
+          </span>
+        </div>
+      </label>
     </div>
     <div>
       <p class="mb-1 capitalize">
@@ -67,7 +84,9 @@ const onError = [
   },
 ];
 
-const settings = reactive({});
+const settings = reactive({
+  restartTimes: 3,
+});
 
 watch(
   settings,

+ 4 - 0
src/locales/en/newtab.json

@@ -158,6 +158,10 @@
       "saveLog": "Save workflow log",
       "executedBlockOnWeb": "Show executed block on web page",
       "debugMode": "Debug mode",
+      "restartWorkflow": {
+        "for": "Restart for",
+        "times": "Times"
+      },
       "onError": {
         "title": "On workflow error",
         "items": {

+ 1 - 0
src/models/workflow.js

@@ -34,6 +34,7 @@ class Workflow extends Model {
         blockDelay: 0,
         saveLog: true,
         debugMode: false,
+        restartTimes: 3,
         onError: 'stop-workflow',
         executedBlockOnWeb: false,
       }),