This is an automated email from the ASF dual-hosted git repository.

caishunfeng pushed a commit to branch dev
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/dev by this push:
     new 64f4cb4f3e refactor: dag-menu refactor (#11965)
64f4cb4f3e is described below

commit 64f4cb4f3e92a2a517acc60ac5c70204bea42151
Author: labbomb <[email protected]>
AuthorDate: Mon Sep 26 11:06:39 2022 +0800

    refactor: dag-menu refactor (#11965)
    
    * refactor: dag-menu refactor
    
    * feat: add i18n support for the dag-menu
    
    * feat: add e2e class
    
    Co-authored-by: devosend <[email protected]>
    Co-authored-by: Tq <[email protected]>
---
 .../api/configuration/TaskTypeConfiguration.java   |  30 +-
 .../api/service/impl/FavTaskServiceImpl.java       |  14 +-
 .../src/main/resources/task-type-config.yaml       |   1 +
 .../src/main/resources/sql/dolphinscheduler_h2.sql |   6 +-
 .../resources/sql/dolphinscheduler_postgresql.sql  |   6 +-
 .../e2e/cases/WorkflowE2ETest.java                 |   2 +-
 .../project/workflow/WorkflowDefinitionTab.java    |  10 +
 dolphinscheduler-ui/src/locales/en_US/project.ts   |   9 +
 dolphinscheduler-ui/src/locales/zh_CN/project.ts   |   9 +
 .../src/service/modules/dag-menu/index.ts          |  39 ++
 dolphinscheduler-ui/src/store/project/index.ts     |  19 +
 dolphinscheduler-ui/src/store/project/task-type.ts | 167 ++++++++
 dolphinscheduler-ui/src/store/project/types.ts     |  58 ++-
 .../node/fields/use-java-task-main-jar.ts          |   2 +-
 .../task/components/node/fields/use-java.ts        |  87 ++--
 .../task/components/node/fields/use-task-type.ts   |   2 +-
 .../projects/task/components/node/format-data.ts   |   6 +-
 .../task/components/node/tasks/use-java.ts         |   6 +-
 .../views/projects/task/components/node/types.ts   |  11 +-
 .../projects/task/components/node/use-task.ts      |   2 +-
 .../views/projects/task/definition/batch-task.tsx  |   2 +-
 .../workflow/components/dag/dag-sidebar.tsx        | 472 +++++++++++++++++++--
 .../workflow/components/dag/dag.module.scss        |  10 +
 .../projects/workflow/components/dag/types.ts      |   4 +-
 .../workflow/components/dag/use-cell-update.ts     |   4 +-
 .../components/dag/use-custom-cell-builder.ts      |   8 +-
 .../workflow/components/dag/use-dag-drag-drop.ts   |   2 +-
 .../workflow/components/dag/use-task-edit.ts       |   2 +-
 28 files changed, 860 insertions(+), 130 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/TaskTypeConfiguration.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/TaskTypeConfiguration.java
index 1db441495d..64b6cc3e43 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/TaskTypeConfiguration.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/configuration/TaskTypeConfiguration.java
@@ -55,26 +55,18 @@ public class TaskTypeConfiguration {
     private static final List<FavTaskDto> defaultTaskTypes = new ArrayList<>();
 
     public List<FavTaskDto> getDefaultTaskTypes() {
-        if (defaultTaskTypes.size() <= 0) {
-            printDefaultTypes();
-            universal.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_UNIVERSAL)));
-            cloud.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, 
false, Constants.TYPE_CLOUD)));
-            logic.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, 
false, Constants.TYPE_LOGIC)));
-            dataIntegration.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_DATA_INTEGRATION)));
-            dataQuality.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_DATA_QUALITY)));
-            machineLearning.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_MACHINE_LEARNING)));
-            other.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, 
false, Constants.TYPE_OTHER)));
-
+        if (!defaultTaskTypes.isEmpty()) {
+            return defaultTaskTypes;
         }
-        List<FavTaskDto> result = new ArrayList<>();
-        defaultTaskTypes.forEach(e -> {
-            try {
-                result.add((FavTaskDto) e.clone());
-            } catch (CloneNotSupportedException ex) {
-                throw new RuntimeException(ex);
-            }
-        });
-        return result;
+        printDefaultTypes();
+        universal.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, 
false, Constants.TYPE_UNIVERSAL)));
+        cloud.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, false, 
Constants.TYPE_CLOUD)));
+        logic.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, false, 
Constants.TYPE_LOGIC)));
+        dataIntegration.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_DATA_INTEGRATION)));
+        dataQuality.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, 
false, Constants.TYPE_DATA_QUALITY)));
+        machineLearning.forEach(task -> defaultTaskTypes.add(new 
FavTaskDto(task, false, Constants.TYPE_MACHINE_LEARNING)));
+        other.forEach(task -> defaultTaskTypes.add(new FavTaskDto(task, false, 
Constants.TYPE_OTHER)));
+        return defaultTaskTypes;
     }
 
     public void printDefaultTypes() {
diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/FavTaskServiceImpl.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/FavTaskServiceImpl.java
index 81019b08ec..f04bf89d3f 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/FavTaskServiceImpl.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/service/impl/FavTaskServiceImpl.java
@@ -43,12 +43,20 @@ public class FavTaskServiceImpl extends BaseServiceImpl 
implements FavTaskServic
         Set<String> userFavTaskTypes = 
favMapper.getUserFavTaskTypes(loginUser.getId());
 
         List<FavTaskDto> defaultTaskTypes = 
taskTypeConfiguration.getDefaultTaskTypes();
+        List<FavTaskDto> result = new ArrayList<>();
+        // clone default list and modify fav task type flag
         defaultTaskTypes.forEach(e -> {
-            if (userFavTaskTypes.contains(e.getTaskName())) {
-                e.setCollection(true);
+            try {
+                FavTaskDto clone = (FavTaskDto) e.clone();
+                if (userFavTaskTypes.contains(clone.getTaskName())) {
+                    clone.setCollection(true);
+                }
+                result.add(clone);
+            } catch (CloneNotSupportedException ex) {
+                throw new RuntimeException(ex);
             }
         });
-        return defaultTaskTypes;
+        return result;
     }
 
     @Override
diff --git a/dolphinscheduler-api/src/main/resources/task-type-config.yaml 
b/dolphinscheduler-api/src/main/resources/task-type-config.yaml
index 0172b261a7..23307d8a07 100644
--- a/dolphinscheduler-api/src/main/resources/task-type-config.yaml
+++ b/dolphinscheduler-api/src/main/resources/task-type-config.yaml
@@ -18,6 +18,7 @@
 task:
   universal:
     - 'SHELL'
+    - 'JAVA'
     - 'PYTHON'
     - 'PROCEDURE'
     - 'SQL'
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
index 527d61f004..097790d143 100644
--- a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
+++ b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_h2.sql
@@ -2003,10 +2003,10 @@ INSERT INTO `t_ds_cluster`
 VALUES (100, 0, 'ds_null_k8s', '{"k8s":"ds_null_k8s"}', 'test', 1, '2021-03-03 
11:31:24.0', '2021-03-03 11:31:24.0');
 
 --
--- Table structure for t_ds_fav
+-- Table structure for t_ds_fav_task
 --
-DROP TABLE IF EXISTS t_ds_fav CASCADE;
-CREATE TABLE t_ds_fav
+DROP TABLE IF EXISTS t_ds_fav_task CASCADE;
+CREATE TABLE t_ds_fav_task
 (
     id        bigint(20) NOT NULL AUTO_INCREMENT,
     task_name varchar(64) NOT NULL,
diff --git 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
index 6da0808073..18e222ea5b 100644
--- 
a/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
+++ 
b/dolphinscheduler-dao/src/main/resources/sql/dolphinscheduler_postgresql.sql
@@ -1958,11 +1958,11 @@ CREATE TABLE t_ds_cluster(
 );
 
 --
--- Table structure for t_ds_fav
+-- Table structure for t_ds_fav_task
 --
 
-DROP TABLE IF EXISTS t_ds_fav;
-CREATE TABLE t_ds_fav
+DROP TABLE IF EXISTS t_ds_fav_task;
+CREATE TABLE t_ds_fav_task
 (
     id        serial      NOT NULL,
     task_name varchar(64) NOT NULL,
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/WorkflowE2ETest.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/WorkflowE2ETest.java
index cc2430eb20..360cdb5ccf 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/WorkflowE2ETest.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/cases/WorkflowE2ETest.java
@@ -142,7 +142,7 @@ class WorkflowE2ETest {
                 .goToTab(WorkflowDefinitionTab.class);
 
         workflowDefinitionPage
-            .createWorkflow()
+            .createSubProcessWorkflow()
 
             .<SubWorkflowTaskForm> addTask(TaskType.SUB_PROCESS)
             .childNode("test-workflow-1")
diff --git 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/project/workflow/WorkflowDefinitionTab.java
 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/project/workflow/WorkflowDefinitionTab.java
index 9707dee596..716a2e44b9 100644
--- 
a/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/project/workflow/WorkflowDefinitionTab.java
+++ 
b/dolphinscheduler-e2e/dolphinscheduler-e2e-case/src/test/java/org/apache/dolphinscheduler/e2e/pages/project/workflow/WorkflowDefinitionTab.java
@@ -59,6 +59,9 @@ public final class WorkflowDefinitionTab extends NavBarPage 
implements ProjectDe
     @FindBy(className = "items")
     private List<WebElement> workflowList;
 
+    @FindBy(className = "task-cate-logic")
+    private WebElement subProcessList;
+
     public WorkflowDefinitionTab(RemoteWebDriver driver) {
         super(driver);
     }
@@ -69,6 +72,13 @@ public final class WorkflowDefinitionTab extends NavBarPage 
implements ProjectDe
         return new WorkflowForm(driver);
     }
 
+    public WorkflowForm createSubProcessWorkflow() {
+        buttonCreateProcess().click();
+        subProcessList().click();
+
+        return new WorkflowForm(driver);
+    }
+
     public WorkflowDefinitionTab publish(String workflow) {
         workflowList()
             .stream()
diff --git a/dolphinscheduler-ui/src/locales/en_US/project.ts 
b/dolphinscheduler-ui/src/locales/en_US/project.ts
index 1cd99025fa..3697187a90 100644
--- a/dolphinscheduler-ui/src/locales/en_US/project.ts
+++ b/dolphinscheduler-ui/src/locales/en_US/project.ts
@@ -785,5 +785,14 @@ export default {
     pytorch_conda_python_version: 'Python Version',
     pytorch_conda_python_version_tips:
       'Please enter the version number, such as 3.6, 3.7, 3.x'
+  },
+  menu: {
+    fav: 'Favorites',
+    universal: 'Universal',
+    cloud: 'Cloud',
+    logic: 'Logic',
+    di: 'Data Integration',
+    dq: 'Data Quality',
+    other: 'Other',
   }
 }
diff --git a/dolphinscheduler-ui/src/locales/zh_CN/project.ts 
b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
index d99fdf275f..071a49e232 100644
--- a/dolphinscheduler-ui/src/locales/zh_CN/project.ts
+++ b/dolphinscheduler-ui/src/locales/zh_CN/project.ts
@@ -765,5 +765,14 @@ export default {
     pytorch_requirements: '依赖文件',
     pytorch_conda_python_version: 'python版本',
     pytorch_conda_python_version_tips: '请输入版本号,如 3.6, 3.7, 3.x等'
+  },
+  menu: {
+    fav: '收藏组件',
+    universal: '通用组件',
+    cloud: '云',
+    logic: '逻辑节点',
+    di: '数据集成',
+    dq: '数据质量',
+    other: '其他',
   }
 }
diff --git a/dolphinscheduler-ui/src/service/modules/dag-menu/index.ts 
b/dolphinscheduler-ui/src/service/modules/dag-menu/index.ts
new file mode 100644
index 0000000000..b107ed2caa
--- /dev/null
+++ b/dolphinscheduler-ui/src/service/modules/dag-menu/index.ts
@@ -0,0 +1,39 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+import { axios } from '@/service/service'
+
+export function getDagMenu(): any {
+  return axios({
+    url: '/favourite/taskTypes',
+    method: 'get'
+  })
+}
+
+export function Collection(taskName: string): any {
+  return axios({
+    url: `/favourite/${taskName}`,
+    method: 'post'
+  })
+}
+
+export function CancelCollection(taskName: string): any {
+  return axios({
+    url: `/favourite/${taskName}`,
+    method: 'delete'
+  })
+}
diff --git a/dolphinscheduler-ui/src/store/project/index.ts 
b/dolphinscheduler-ui/src/store/project/index.ts
new file mode 100644
index 0000000000..2b171a588b
--- /dev/null
+++ b/dolphinscheduler-ui/src/store/project/index.ts
@@ -0,0 +1,19 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+export * from './task-node'
+export * from './task-type'
diff --git a/dolphinscheduler-ui/src/store/project/task-type.ts 
b/dolphinscheduler-ui/src/store/project/task-type.ts
new file mode 100644
index 0000000000..1dd4d1c448
--- /dev/null
+++ b/dolphinscheduler-ui/src/store/project/task-type.ts
@@ -0,0 +1,167 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+import { defineStore } from 'pinia'
+import type {
+  TaskTypeState,
+  TaskType,
+  ITaskTypeItem,
+  TaskExecuteType
+} from './types'
+
+export const TASK_TYPES_MAP = {
+  JAVA: {
+    alias: 'JAVA'
+  },
+  SHELL: {
+    alias: 'SHELL'
+  },
+  SUB_PROCESS: {
+    alias: 'SUB_PROCESS'
+  },
+  PROCEDURE: {
+    alias: 'PROCEDURE'
+  },
+  SQL: {
+    alias: 'SQL'
+  },
+  SPARK: {
+    alias: 'SPARK'
+  },
+  FLINK: {
+    alias: 'FLINK'
+  },
+  MR: {
+    alias: 'MapReduce',
+    helperLinkDisable: true
+  },
+  PYTHON: {
+    alias: 'PYTHON'
+  },
+  DEPENDENT: {
+    alias: 'DEPENDENT'
+  },
+  HTTP: {
+    alias: 'HTTP'
+  },
+  DATAX: {
+    alias: 'DataX'
+  },
+  PIGEON: {
+    alias: 'PIGEON'
+  },
+  SQOOP: {
+    alias: 'SQOOP',
+    helperLinkDisable: true
+  },
+  CONDITIONS: {
+    alias: 'CONDITIONS'
+  },
+  DATA_QUALITY: {
+    alias: 'DATA_QUALITY',
+    helperLinkDisable: true
+  },
+  SWITCH: {
+    alias: 'SWITCH'
+  },
+  SEATUNNEL: {
+    alias: 'SeaTunnel',
+    helperLinkDisable: true
+  },
+  EMR: {
+    alias: 'AmazonEMR',
+    helperLinkDisable: true
+  },
+  ZEPPELIN: {
+    alias: 'ZEPPELIN',
+    helperLinkDisable: true
+  },
+  JUPYTER: {
+    alias: 'JUPYTER',
+    helperLinkDisable: true
+  },
+  K8S: {
+    alias: 'K8S',
+    helperLinkDisable: true
+  },
+  MLFLOW: {
+    alias: 'MLFLOW',
+    helperLinkDisable: true
+  },
+  OPENMLDB: {
+    alias: 'OPENMLDB',
+    helperLinkDisable: true
+  },
+  DVC: {
+    alias: 'DVC',
+    helperLinkDisable: true
+  },
+  DINKY: {
+    alias: 'DINKY',
+    helperLinkDisable: true
+  },
+  SAGEMAKER: {
+    alias: 'SageMaker',
+    helperLinkDisable: true
+  },
+  CHUNJUN: {
+    alias: 'CHUNJUN',
+    helperLinkDisable: true
+  },
+  FLINK_STREAM: {
+    alias: 'FLINK_STREAM',
+    helperLinkDisable: true,
+    taskExecuteType: 'STREAM'
+  },
+  PYTORCH: {
+    alias: 'Pytorch',
+    helperLinkDisable: true
+  },
+  HIVECLI: {
+    alias: 'HIVECLI',
+    helperLinkDisable: true
+  }
+} as {
+  [key in TaskType]: {
+    alias: string
+    helperLinkDisable?: boolean
+    taskExecuteType?: TaskExecuteType
+  }
+}
+
+export const useTaskTypeStore = defineStore({
+  id: 'project-task-type',
+  state: (): TaskTypeState => ({
+    types: []
+  }),
+  persist: true,
+  getters: {
+    getTaskType(): ITaskTypeItem[] {
+      return this.types
+    }
+  },
+  actions: {
+    setTaskTypes(types: TaskType[]): void {
+      try {
+        this.types = types
+          .filter((type) => !!TASK_TYPES_MAP[type])
+          .map((type) => ({ ...TASK_TYPES_MAP[type], type }))
+      } catch (err) {
+        this.types = []
+      }
+    }
+  }
+})
diff --git a/dolphinscheduler-ui/src/store/project/types.ts 
b/dolphinscheduler-ui/src/store/project/types.ts
index 147a84503e..e8d8467ca5 100644
--- a/dolphinscheduler-ui/src/store/project/types.ts
+++ b/dolphinscheduler-ui/src/store/project/types.ts
@@ -18,7 +18,42 @@
 import type { EditWorkflowDefinition } from 
'@/views/projects/workflow/components/dag/types'
 import type { IOption } from '@/components/form/types'
 
-type ProgramType = 'JAVA' | 'SCALA' | 'PYTHON' | 'SQL'
+type TaskExecuteType = 'STREAM' | 'BATCH'
+
+type TaskType =
+  | 'SHELL'
+  | 'SUB_PROCESS'
+  | 'PROCEDURE'
+  | 'SQL'
+  | 'SPARK'
+  | 'FLINK'
+  | 'MR'
+  | 'PYTHON'
+  | 'DEPENDENT'
+  | 'HTTP'
+  | 'DATAX'
+  | 'PIGEON'
+  | 'SQOOP'
+  | 'CONDITIONS'
+  | 'DATA_QUALITY'
+  | 'SWITCH'
+  | 'SEATUNNEL'
+  | 'EMR'
+  | 'ZEPPELIN'
+  | 'K8S'
+  | 'JUPYTER'
+  | 'MLFLOW'
+  | 'OPENMLDB'
+  | 'DVC'
+  | 'JAVA'
+  | 'DINKY'
+  | 'SAGEMAKER'
+  | 'CHUNJUN'
+  | 'FLINK_STREAM'
+  | 'PYTORCH'
+  | 'HIVECLI'
+
+type ProgramType = 'JAVA' | 'SCALA' | 'PYTHON'
 type DependentResultType = {
   [key: string]: 'SUCCESS' | 'WAITING_THREAD' | 'FAILURE'
 }
@@ -45,6 +80,20 @@ interface TaskNodeState {
   name: string
   dependentResult: DependentResultType
 }
+
+interface ITaskType {
+  alias: string
+  helperLinkDisable?: boolean
+  taskDefinitionDisable?: boolean
+  taskExecuteType?: TaskExecuteType
+}
+interface ITaskTypeItem extends ITaskType {
+  type: TaskType
+}
+interface TaskTypeState {
+  types: ITaskTypeItem[]
+}
+
 export {
   TaskNodeState,
   EditWorkflowDefinition,
@@ -53,5 +102,10 @@ export {
   ProgramType,
   DependentResultType,
   BDependentResultType,
-  IMainJar
+  IMainJar,
+  TaskType,
+  ITaskType,
+  ITaskTypeItem,
+  TaskTypeState,
+  TaskExecuteType
 }
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java-task-main-jar.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java-task-main-jar.ts
index 3fe1fea9ed..fed6ef3bc1 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java-task-main-jar.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java-task-main-jar.ts
@@ -49,7 +49,7 @@ export function useJavaTaskMainJar(model: { [field: string]: 
any }): IJsonItem {
   watch(
     () => model.programType,
     (value) => {
-        getMainJars(value)
+      getMainJars(value)
     }
   )
 
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java.ts
index 3b05a9c16d..b8a47c8935 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-java.ts
@@ -16,7 +16,7 @@
  */
 import { computed } from 'vue'
 import { useI18n } from 'vue-i18n'
-import { useCustomParams, useResources ,useJavaTaskMainJar} from '.'
+import { useCustomParams, useResources, useJavaTaskMainJar } from '.'
 import type { IJsonItem } from '../types'
 
 export function useJava(model: { [field: string]: any }): IJsonItem[] {
@@ -24,39 +24,39 @@ export function useJava(model: { [field: string]: any }): 
IJsonItem[] {
   const rawScriptSpan = computed(() => (model.runType === 'JAR' ? 0 : 24))
   return [
     {
-        type: 'select',
-        field: 'runType',
-        span: 12,
-        name: t('project.node.run_type'),
-        options: RUN_TYPES,
-        value: model.runType
-      },
-      {
-          type: 'switch',
-          field: 'isModulePath',
-          span: 24,
-          name: t('project.node.is_module_path'),
-          value: model.isModulePath
-      },
-      {
-        type: 'input',
-        field: 'mainArgs',
-        name: t('project.node.main_arguments'),
-        props: {
-          type: 'textarea',
-          placeholder: t('project.node.main_arguments_tips')
-        }
-      },
-      {
-        type: 'input',
-        field: 'jvmArgs',
-        name: t('project.node.jvm_args'),
-        props: {
-          type: 'textarea',
-          placeholder: t('project.node.jvm_args_tips')
-        }
-      },
-      useJavaTaskMainJar(model),
+      type: 'select',
+      field: 'runType',
+      span: 12,
+      name: t('project.node.run_type'),
+      options: RUN_TYPES,
+      value: model.runType
+    },
+    {
+      type: 'switch',
+      field: 'isModulePath',
+      span: 24,
+      name: t('project.node.is_module_path'),
+      value: model.isModulePath
+    },
+    {
+      type: 'input',
+      field: 'mainArgs',
+      name: t('project.node.main_arguments'),
+      props: {
+        type: 'textarea',
+        placeholder: t('project.node.main_arguments_tips')
+      }
+    },
+    {
+      type: 'input',
+      field: 'jvmArgs',
+      name: t('project.node.jvm_args'),
+      props: {
+        type: 'textarea',
+        placeholder: t('project.node.jvm_args_tips')
+      }
+    },
+    useJavaTaskMainJar(model),
     {
       type: 'editor',
       field: 'rawScript',
@@ -74,13 +74,12 @@ export function useJava(model: { [field: string]: any }): 
IJsonItem[] {
 }
 
 export const RUN_TYPES = [
-    {
-      label: 'JAVA',
-      value: 'JAVA'
-    },
-    {
-      label: 'JAR',
-      value: 'JAR'
-    }
-  ]
-  
\ No newline at end of file
+  {
+    label: 'JAVA',
+    value: 'JAVA'
+  },
+  {
+    label: 'JAR',
+    value: 'JAR'
+  }
+]
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-task-type.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-task-type.ts
index cbd50f489a..3fb9b63c63 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-task-type.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-task-type.ts
@@ -16,7 +16,7 @@
  */
 
 import { useI18n } from 'vue-i18n'
-import { TASK_TYPES_MAP } from '@/views/projects/task/constants/task-type'
+import { TASK_TYPES_MAP } from '@/store/project/task-type'
 import type { IJsonItem } from '../types'
 
 export function useTaskType(
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
index 8e49c49980..edb6cd4043 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/format-data.ts
@@ -36,13 +36,13 @@ export function formatParams(data: INodeData): {
     taskParams.processDefinitionCode = data.processDefinitionCode
   }
 
-  if(data.taskType === 'JAVA'){
+  if (data.taskType === 'JAVA') {
     taskParams.runType = data.runType
     taskParams.mainArgs = data.mainArgs
     taskParams.jvmArgs = data.jvmArgs
     taskParams.isModulePath = data.isModulePath
-    if(data.runType === 'JAR' && data.mainJar){
-      taskParams.mainJar = {id: data.mainJar};
+    if (data.runType === 'JAR' && data.mainJar) {
+      taskParams.mainJar = { id: data.mainJar }
     }
   }
 
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
index 8f85266987..d079888a23 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/tasks/use-java.ts
@@ -48,9 +48,9 @@ export function useJava({
     timeoutNotifyStrategy: ['WARN'],
     timeout: 30,
     mainJar: undefined,
-    runType:'JAVA',
-    mainArgs:'',
-    jvmArgs:'',
+    runType: 'JAVA',
+    mainArgs: '',
+    jvmArgs: '',
     programType: 'JAVA'
   } as unknown as INodeData)
 
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
index 88b4076f0a..c013a7b2fb 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/types.ts
@@ -17,10 +17,7 @@
 
 import { VNode } from 'vue'
 import type { SelectOption } from 'naive-ui'
-import type {
-  TaskExecuteType,
-  TaskType
-} from '@/views/projects/task/constants/task-type'
+import type { TaskExecuteType, TaskType } from '@/store/project/types'
 import type { IDataBase } from '@/service/modules/data-source/types'
 import type {
   IFormItem,
@@ -223,9 +220,9 @@ interface ITaskParams {
   resourceList?: ISourceItem[]
   mainJar?: ISourceItem
   localParams?: ILocalParam[]
-  runType?:string
-  jvmArgs?:string
-  isModulePath?:boolean
+  runType?: string
+  jvmArgs?: string
+  isModulePath?: boolean
   rawScript?: string
   initScript?: string
   programType?: string
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/use-task.ts 
b/dolphinscheduler-ui/src/views/projects/task/components/node/use-task.ts
index 721fcc7818..ffefb3af37 100644
--- a/dolphinscheduler-ui/src/views/projects/task/components/node/use-task.ts
+++ b/dolphinscheduler-ui/src/views/projects/task/components/node/use-task.ts
@@ -18,7 +18,7 @@ import { ref, Ref, unref } from 'vue'
 import nodes from './tasks'
 import getElementByJson from '@/components/form/get-elements-by-json'
 import { useTaskNodeStore } from '@/store/project/task-node'
-import { TASK_TYPES_MAP } from '../../constants/task-type'
+import { TASK_TYPES_MAP } from '@/store/project/task-type'
 import type {
   IFormItem,
   IJsonItem,
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx 
b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx
index 86f9f21d64..8887e26a95 100644
--- a/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx
+++ b/dolphinscheduler-ui/src/views/projects/task/definition/batch-task.tsx
@@ -36,7 +36,7 @@ import { SearchOutlined } from '@vicons/antd'
 import { useI18n } from 'vue-i18n'
 import { useTable } from './use-table'
 import { useTask } from './use-task'
-import { TASK_TYPES_MAP } from '@/views/projects/task/constants/task-type'
+import { TASK_TYPES_MAP } from '@/store/project/task-type'
 import Card from '@/components/card'
 import VersionModal from './components/version-modal'
 import MoveModal from './components/move-modal'
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-sidebar.tsx
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-sidebar.tsx
index 965d082ca8..5fd704f1a0 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-sidebar.tsx
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag-sidebar.tsx
@@ -15,42 +15,458 @@
  * limitations under the License.
  */
 
-import { defineComponent } from 'vue'
-import {
-  TaskType,
-  TASK_TYPES_MAP
-} from '@/views/projects/task/constants/task-type'
+import { defineComponent, onMounted, reactive } from 'vue'
 import styles from './dag.module.scss'
+import type { TaskType } from './types'
+import { NCollapse, NCollapseItem, NIcon } from 'naive-ui'
+import { StarFilled, StarOutlined } from '@vicons/antd'
+import {
+  CancelCollection,
+  Collection,
+  getDagMenu
+} from '@/service/modules/dag-menu'
+import { useI18n } from 'vue-i18n'
 
 export default defineComponent({
   name: 'workflow-dag-sidebar',
   emits: ['dragStart'],
   setup(props, context) {
-    const allTaskTypes = Object.keys(TASK_TYPES_MAP).map((type) => ({
-      type,
-      ...TASK_TYPES_MAP[type as TaskType]
-    }))
+    const variables = reactive({
+      dataList: [],
+      universal: [],
+      cloud: [],
+      logic: [],
+      di: [],
+      dq: [],
+      other: [],
+      fav: []
+    })
+
+    const { t } = useI18n()
+
+    const handleDagMenu = () => {
+      getDagMenu().then((res: any) => {
+        variables.dataList = res.map((item: any) => {
+          return {
+            ...item,
+            starHover: false,
+            type: item.taskName
+          }
+        })
+        variables.universal = variables.dataList.filter(
+          (item: any) => item.taskType === 'Universal'
+        )
+        variables.cloud = variables.dataList.filter(
+          (item: any) => item.taskType === 'Cloud'
+        )
+        variables.logic = variables.dataList.filter(
+          (item: any) => item.taskType === 'Logic'
+        )
+        variables.di = variables.dataList.filter(
+          (item: any) => item.taskType === 'DataIntegration'
+        )
+        variables.dq = variables.dataList.filter(
+          (item: any) => item.taskType === 'DataQuality'
+        )
+        variables.other = variables.dataList.filter(
+          (item: any) => item.taskType === 'Other'
+        )
+        variables.fav = variables.dataList.filter(
+          (item: any) => item.collection === true
+        )
+      })
+    }
+
+    const handleCollection = (item: any) => {
+      item.collection
+        ? CancelCollection(item.taskName).then(() => {
+            handleDagMenu()
+          })
+        : Collection(item.taskName).then(() => {
+            handleDagMenu()
+          })
+      item.collection = !item.collection
+    }
+
+    onMounted(() => {
+      handleDagMenu()
+    })
 
-    return () => (
+    return () =>
       <div class={styles.sidebar}>
-        {allTaskTypes.map((task) => (
-          <div
-            class={[styles.draggable, `task-item-${task.type}`]}
-            draggable='true'
-            onDragstart={(e) => {
-              context.emit('dragStart', e, task.type as TaskType)
-            }}
-          >
-            <em
-              class={[
-                styles['sidebar-icon'],
-                styles['icon-' + task.type.toLocaleLowerCase()]
-              ]}
-            />
-            <span>{task.alias}</span>
-          </div>
-        ))}
+        <NCollapse default-expanded-names='1' accordion>
+          {variables.fav.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.fav')}
+              name='0'
+              class='task-cate-fav'
+              v-slots={{
+                default: () => {
+                  return variables.fav.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.universal.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.universal')}
+              name='1'
+              class='task-cate-universal'
+              v-slots={{
+                default: () => {
+                  return variables.universal.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.cloud.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.cloud')}
+              name='2'
+              class='task-cate-cloud'
+              v-slots={{
+                default: () => {
+                  return variables.cloud.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.logic.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.logic')}
+              name='3'
+              class='task-cate-logic'
+              v-slots={{
+                default: () => {
+                  return variables.logic.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.di.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.di')}
+              name='4'
+              class='task-cate-di'
+              v-slots={{
+                default: () => {
+                  return variables.di.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.dq.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.dq')}
+              name='5'
+              class='task-cate-dq'
+              v-slots={{
+                default: () => {
+                  return variables.dq.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+          {variables.other.length > 0 && (
+            <NCollapseItem
+              title={t('project.menu.other')}
+              name='6'
+              class='task-cate-other'
+              v-slots={{
+                default: () => {
+                  return variables.other.map((task: any) => (
+                    <div
+                      class={[styles.draggable, `task-item-${task.type}`]}
+                      draggable='true'
+                      onDragstart={(e) => {
+                        context.emit('dragStart', e, task.type as TaskType)
+                      }}
+                    >
+                      <em
+                        class={[
+                          styles['sidebar-icon'],
+                          styles['icon-' + task.type.toLocaleLowerCase()]
+                        ]}
+                      />
+                      <span>{task.taskName}</span>
+                      <div
+                        class={styles.stars}
+                        onMouseenter={() => {
+                          task.starHover = true
+                        }}
+                        onMouseleave={() => {
+                          task.starHover = false
+                        }}
+                        onClick={() => handleCollection(task)}
+                      >
+                        <NIcon
+                          size='20'
+                          color={
+                            task.collection || task.starHover
+                              ? '#288FFF'
+                              : '#ccc'
+                          }
+                        >
+                          {task.collection ? (
+                            <StarFilled />
+                          ) : (
+                            <StarOutlined />
+                          )}
+                        </NIcon>
+                      </div>
+                    </div>
+                  ))
+                }
+              }}
+            ></NCollapseItem>
+          )}
+        </NCollapse>
       </div>
-    )
   }
 })
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
index 8c27b71785..bc56538ee4 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/dag.module.scss
@@ -289,6 +289,16 @@ $bgLight: #ffffff;
       }
     }
   }
+
+  span {
+    display: flex;
+    flex: 1;
+  }
+
+  .stars {
+    display: flex;
+    cursor: pointer;
+  }
 }
 
 .dag-dark .draggable {
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/types.ts 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/types.ts
index f76a045f52..a68fe25003 100644
--- a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/types.ts
+++ b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/types.ts
@@ -15,7 +15,7 @@
  * limitations under the License.
  */
 
-import { TaskType } from '@/views/projects/task/constants/task-type'
+import type { TaskType } from '@/store/project/types'
 export type { ITaskState } from '@/common/types'
 
 export interface ProcessDefinition {
@@ -172,3 +172,5 @@ export interface IWorkflowTaskInstance {
   taskCode: number
   taskType: string
 }
+
+export { TaskType }
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-cell-update.ts
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-cell-update.ts
index 1fa614c3d6..63e6927474 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-cell-update.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-cell-update.ts
@@ -17,9 +17,9 @@
 
 import type { Ref } from 'vue'
 import type { Graph } from '@antv/x6'
-import type { TaskType } from '@/views/projects/task/constants/task-type'
+import type { TaskType } from '@/store/project/types'
 import type { Coordinate } from './types'
-import { TASK_TYPES_MAP } from '@/views/projects/task/constants/task-type'
+import { TASK_TYPES_MAP } from '@/store/project/task-type'
 import { useCustomCellBuilder } from './dag-hooks'
 import utils from '@/utils'
 import type { Edge } from '@antv/x6'
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-custom-cell-builder.ts
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-custom-cell-builder.ts
index 52e2a4c988..7ff2e0c53d 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-custom-cell-builder.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-custom-cell-builder.ts
@@ -18,10 +18,8 @@
 import type { Node, Edge } from '@antv/x6'
 import { X6_NODE_NAME, X6_EDGE_NAME } from './dag-config'
 import utils from '@/utils'
-import {
-  TASK_TYPES_MAP,
-  TaskType
-} from '@/views/projects/task/constants/task-type'
+import { TaskType } from '@/store/project/types'
+import { TASK_TYPES_MAP } from '@/store/project/task-type'
 import { WorkflowDefinition, Coordinate } from './types'
 
 export function useCustomCellBuilder() {
@@ -96,7 +94,7 @@ export function useCustomCellBuilder() {
           // Use href instead of xlink:href, you may lose the icon when 
downloadPNG
           'xlink:href': `${
             import.meta.env.BASE_URL
-          }images/task-icons/${(type !== 'FLINK_STREAM'
+          }images/task-icons/${(type !== ('FLINK_STREAM' as TaskType)
             ? type
             : 'FLINK'
           ).toLocaleLowerCase()}.png`
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-dag-drag-drop.ts
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-dag-drag-drop.ts
index e3a4276f38..59eaf606f6 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-dag-drag-drop.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-dag-drag-drop.ts
@@ -20,7 +20,7 @@ import type { Ref } from 'vue'
 import type { Graph } from '@antv/x6'
 import { genTaskCodeList } from '@/service/modules/task-definition'
 import { Coordinate, Dragged } from './types'
-import { TaskType } from '@/views/projects/task/constants/task-type'
+import { TaskType } from '@/store/project/types'
 import { useRoute } from 'vue-router'
 
 interface Options {
diff --git 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-task-edit.ts
 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-task-edit.ts
index f7759b25e9..9056d94e48 100644
--- 
a/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-task-edit.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/workflow/components/dag/use-task-edit.ts
@@ -17,7 +17,7 @@
 
 import { ref, onMounted, watch } from 'vue'
 import { remove, cloneDeep } from 'lodash'
-import { TaskType } from '@/views/projects/task/constants/task-type'
+import { TaskType } from '@/store/project/types'
 import { formatParams } from 
'@/views/projects/task/components/node/format-data'
 import { useCellUpdate } from './dag-hooks'
 import type { Ref } from 'vue'

Reply via email to