Ahmad Kholid 1 year ago
parent
commit
3d02666b81

+ 1 - 1
package.json

@@ -1,6 +1,6 @@
 {
   "name": "automa",
-  "version": "1.28.12",
+  "version": "1.28.13",
   "description": "An extension for automating your browser by connecting blocks",
   "repository": {
     "type": "git",

+ 52 - 9
src/components/newtab/workflow/editor/EditorDebugging.vue

@@ -78,18 +78,59 @@
         </ui-list-item>
       </ui-list>
     </div>
-    <shared-codemirror
-      :model-value="JSON.stringify(workflowData, null, 2)"
-      :line-numbers="false"
-      hide-lang
-      readonly
-      lang="json"
-      class="h-40 w-64 scroll breakpoint-data"
-    />
+    <div class="w-64">
+      <ui-tabs v-model="activeTab" class="-mt-1">
+        <ui-tab class="!py-2" value="workflow-data">Data</ui-tab>
+        <ui-tab class="!py-2" value="workflow-logs">Logs</ui-tab>
+      </ui-tabs>
+      <ui-tab-panels v-model="activeTab">
+        <ui-tab-panel value="workflow-data">
+          <shared-codemirror
+            :model-value="JSON.stringify(workflowData, null, 2)"
+            :line-numbers="false"
+            hide-lang
+            readonly
+            lang="json"
+            class="h-40 scroll breakpoint-data"
+          />
+        </ui-tab-panel>
+        <ui-tab-panel
+          ref="workflowLogsContainer"
+          value="workflow-logs"
+          class="h-40 scroll text-sm overflow-auto"
+        >
+          <ui-list class="mt-2">
+            <ui-list-item
+              v-for="item in (workflowState?.state?.logs ?? [])
+                .slice(-100)
+                .reverse()"
+              :key="item.id"
+              small
+              class="!block"
+            >
+              <div class="flex items-center gap-2 overflow-hidden w-full">
+                <p class="flex-1 text-overflow leading-tight">
+                  {{ getBlockName(item.name) }}
+                </p>
+                <p
+                  class="text-gray-600 leading-tight dark:text-gray-300 tabular-nums"
+                  :title="t('log.duration')"
+                >
+                  {{ item.duration }}s
+                </p>
+              </div>
+              <p class="flex-1 text-gray-600 leading-tight dark:text-gray-300">
+                {{ item.description }}
+              </p>
+            </ui-list-item>
+          </ui-list>
+        </ui-tab-panel>
+      </ui-tab-panels>
+    </div>
   </ui-card>
 </template>
 <script setup>
-import { defineAsyncComponent, computed, watch } from 'vue';
+import { defineAsyncComponent, computed, watch, shallowRef } from 'vue';
 import { useI18n } from 'vue-i18n';
 import dayjs from '@/lib/dayjs';
 import { tasks } from '@/utils/shared';
@@ -116,6 +157,8 @@ let currentRunningEls = [];
 
 const { t, te } = useI18n();
 
+const activeTab = shallowRef('workflow-data');
+
 const workflowState = computed(() => props.states[0]);
 const workflowData = computed(() => {
   if (!workflowState.value?.state?.ctxData) return {};

+ 1 - 0
src/locales/en/common.json

@@ -65,6 +65,7 @@
     "sortBy": "Sort by",
     "name": "Name",
     "createdAt": "Created date",
+    "updatedAt": "Last update",
     "mostUsed": "Most used"
   },
   "logStatus": {

+ 13 - 0
src/newtab/pages/workflows/[id].vue

@@ -295,6 +295,8 @@ import {
   computed,
   onMounted,
   shallowRef,
+  onActivated,
+  onDeactivated,
   onBeforeUnmount,
 } from 'vue';
 import cloneDeep from 'lodash.clonedeep';
@@ -1525,6 +1527,7 @@ function checkWorkflowUpdate() {
 }
 /* eslint-disable consistent-return */
 function onBeforeLeave() {
+  document.documentElement.classList.remove('scroll');
   updateHostedWorkflow();
 
   const dataNotChanged = !state.dataChanged || !haveEditAccess.value;
@@ -1571,12 +1574,20 @@ watch(
 );
 
 onBeforeRouteLeave(onBeforeLeave);
+onActivated(() => {
+  document.documentElement.classList.add('scroll');
+});
+onDeactivated(() => {
+  document.documentElement.classList.remove('scroll');
+});
 onMounted(() => {
   if (!workflow.value) {
     router.replace(isPackage ? '/packages' : '/');
     return null;
   }
 
+  document.documentElement.classList.add('scroll');
+
   const sidebarState =
     JSON.parse(localStorage.getItem('workflow:sidebar')) ?? true;
   state.showSidebar = sidebarState;
@@ -1605,6 +1616,8 @@ onMounted(() => {
   initAutocomplete();
 });
 onBeforeUnmount(() => {
+  document.documentElement.classList.remove('scroll');
+
   if (isPackage && workflow.value.isExternal) return;
   updateHostedWorkflow();
 });

+ 1 - 1
src/newtab/pages/workflows/index.vue

@@ -401,7 +401,7 @@ const workflowStore = useWorkflowStore();
 const teamWorkflowStore = useTeamWorkflowStore();
 const hostedWorkflowStore = useHostedWorkflowStore();
 
-const sorts = ['name', 'createdAt', 'mostUsed'];
+const sorts = ['name', 'createdAt', 'updatedAt', 'mostUsed'];
 const { teamId, active } = router.currentRoute.value.query;
 const savedSorts = JSON.parse(localStorage.getItem('workflow-sorts') || '{}');
 const validTeamId = userStore.user?.teams?.some(

+ 1 - 1
src/popup/pages/Home.vue

@@ -211,7 +211,7 @@ const hostedWorkflowStore = useHostedWorkflowStore();
 
 useGroupTooltip();
 
-const sorts = ['name', 'createdAt', 'mostUsed'];
+const sorts = ['name', 'createdAt', 'updatedAt', 'mostUsed'];
 const savedSorts =
   parseJSON(localStorage.getItem('popup-workflow-sort'), {}) || {};
 

+ 4 - 2
src/stores/workflow.js

@@ -166,14 +166,16 @@ export const useWorkflowStore = defineStore('workflow', {
       if (!isFunction && !this.workflows[id]) return null;
 
       const updatedWorkflows = {};
+      const updateData = { ...data, updatedAt: Date.now() };
+
       const workflowUpdater = (workflowId) => {
         if (deep) {
           this.workflows[workflowId] = deepmerge(
             this.workflows[workflowId],
-            data
+            updateData
           );
         } else {
-          Object.assign(this.workflows[workflowId], data);
+          Object.assign(this.workflows[workflowId], updateData);
         }
 
         this.workflows[workflowId].updatedAt = Date.now();

+ 1 - 0
src/workflowEngine/WorkflowWorker.js

@@ -260,6 +260,7 @@ class WorkflowWorker {
           ? null
           : this.blocksDetail[block.label].refDataKeys,
     });
+
     const blockDelay = this.settings?.blockDelay || 0;
     const addBlockLog = (status, obj = {}) => {
       let { description } = block.data;

+ 2 - 1
src/workflowEngine/templating/mustacheReplacer.js

@@ -103,7 +103,8 @@ function replacer(str, { regex, tagLen, modifyPath, data }) {
         dataKey = dataKey.slice(1);
       }
 
-      result = objectPath.get(data[dataKey], path) ?? match;
+      result = objectPath.get(data[dataKey], path);
+      if (typeof result === 'undefined') result = match;
 
       if (dataKey === 'secrets') {
         result =

+ 1 - 1
src/workflowEngine/utils/testConditions.js

@@ -71,7 +71,7 @@ export default async function (conditionsArr, workflowData) {
         workflowData.isPopup
       );
 
-      copyData[key] = value ?? '';
+      copyData[key] = parseJSON(value, value);
       Object.assign(result.replacedValue, list);
     }