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

zihaoxiang 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 f3b5d1f57d [Feature-16801][UI] Add copy path of resource file in task 
definition (#16803)
f3b5d1f57d is described below

commit f3b5d1f57da54b0da8dbce630beb1cfe242aab02
Author: xiangzihao <[email protected]>
AuthorDate: Mon Nov 18 17:12:18 2024 +0800

    [Feature-16801][UI] Add copy path of resource file in task definition 
(#16803)
---
 .../dto/resources/visitor/ResourceTreeVisitor.java |  1 +
 .../common/constants/Constants.java                |  2 -
 .../storage/api/AbstractStorageOperator.java       |  2 +-
 .../plugin/storage/api/StorageEntity.java          |  1 +
 .../plugin/storage/api/StorageOperator.java        |  1 -
 .../plugin/storage/cos/CosStorageOperator.java     |  1 +
 .../plugin/storage/gcs/GcsStorageOperator.java     |  1 +
 .../plugin/storage/hdfs/HdfsStorageOperator.java   |  2 +-
 .../storage/hdfs/LocalStorageOperatorTest.java     | 13 +++--
 .../plugin/storage/obs/ObsStorageOperator.java     |  1 +
 .../plugin/storage/oss/OssStorageOperator.java     |  1 +
 .../plugin/storage/s3/S3StorageOperator.java       |  1 +
 .../task/components/node/fields/use-resources.ts   | 57 +++++++++++++++++++++-
 13 files changed, 70 insertions(+), 14 deletions(-)

diff --git 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java
 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java
index 59ccd404f0..f7f93e780d 100644
--- 
a/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java
+++ 
b/dolphinscheduler-api/src/main/java/org/apache/dolphinscheduler/api/dto/resources/visitor/ResourceTreeVisitor.java
@@ -126,6 +126,7 @@ public class ResourceTreeVisitor implements Visitor {
         tempResourceComponent.setName(resource.getFileName());
         tempResourceComponent.setFullName(resource.getFullName());
         tempResourceComponent.setType(resource.getType());
+        tempResourceComponent.setCurrentDir(resource.getRelativePath());
         return tempResourceComponent;
     }
 
diff --git 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
index 254896a27c..cc01c45c1d 100644
--- 
a/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
+++ 
b/dolphinscheduler-common/src/main/java/org/apache/dolphinscheduler/common/constants/Constants.java
@@ -43,8 +43,6 @@ public final class Constants {
     public static final String FORMAT_S_S_COLON = "%s:%s";
     public static final String FOLDER_SEPARATOR = "/";
 
-    public static final String RESOURCE_TYPE_FILE = "resources";
-
     public static final String EMPTY_STRING = "";
 
     /**
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/AbstractStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/AbstractStorageOperator.java
index 72e5867359..76a0f3096f 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/AbstractStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/AbstractStorageOperator.java
@@ -85,7 +85,7 @@ public abstract class AbstractStorageOperator implements 
StorageOperator {
         String resourceBaseDirectory;
         switch (resourceType) {
             case FILE:
-                resourceBaseDirectory = 
FileUtils.concatFilePath(tenantBaseDirectory, FILE_FOLDER_NAME);
+                resourceBaseDirectory = 
FileUtils.concatFilePath(tenantBaseDirectory, StorageOperator.FILE_FOLDER_NAME);
                 break;
             case ALL:
                 resourceBaseDirectory = tenantBaseDirectory;
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageEntity.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageEntity.java
index ef9d588129..e934321b46 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageEntity.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageEntity.java
@@ -46,4 +46,5 @@ public class StorageEntity {
     private long size;
     private Date createTime;
     private Date updateTime;
+    private String relativePath;
 }
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageOperator.java
index fb27bba217..b7855120f1 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-api/src/main/java/org/apache/dolphinscheduler/plugin/storage/api/StorageOperator.java
@@ -25,7 +25,6 @@ import java.util.List;
 public interface StorageOperator {
 
     String FILE_FOLDER_NAME = "resources";
-    String UDF_FOLDER_NAME = "udfs";
 
     ResourceMetadata getResourceMetaData(String resourceAbsolutePath);
 
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-cos/src/main/java/org/apache/dolphinscheduler/plugin/storage/cos/CosStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-cos/src/main/java/org/apache/dolphinscheduler/plugin/storage/cos/CosStorageOperator.java
index a8eb50b33d..e2f605ec91 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-cos/src/main/java/org/apache/dolphinscheduler/plugin/storage/cos/CosStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-cos/src/main/java/org/apache/dolphinscheduler/plugin/storage/cos/CosStorageOperator.java
@@ -306,6 +306,7 @@ public class CosStorageOperator extends 
AbstractStorageOperator implements Close
                 .type(resourceMetaData.getResourceType())
                 .isDirectory(StringUtils.isEmpty(fileExtension))
                 .size(metadata.getContentLength())
+                .relativePath(resourceMetaData.getResourceRelativePath())
                 .createTime(metadata.getLastModified())
                 .updateTime(metadata.getLastModified())
                 .build();
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-gcs/src/main/java/org/apache/dolphinscheduler/plugin/storage/gcs/GcsStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-gcs/src/main/java/org/apache/dolphinscheduler/plugin/storage/gcs/GcsStorageOperator.java
index 45f9c8ab6f..fe85a402b8 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-gcs/src/main/java/org/apache/dolphinscheduler/plugin/storage/gcs/GcsStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-gcs/src/main/java/org/apache/dolphinscheduler/plugin/storage/gcs/GcsStorageOperator.java
@@ -273,6 +273,7 @@ public class GcsStorageOperator extends 
AbstractStorageOperator implements Close
         entity.setDirectory(resourceMetaData.isDirectory());
         entity.setType(resourceMetaData.getResourceType());
         entity.setSize(blob.getSize());
+        entity.setRelativePath(resourceMetaData.getResourceRelativePath());
         
entity.setCreateTime(Date.from(blob.getCreateTimeOffsetDateTime().toInstant()));
         
entity.setUpdateTime(Date.from(blob.getUpdateTimeOffsetDateTime().toInstant()));
         return entity;
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/main/java/org/apache/dolphinscheduler/plugin/storage/hdfs/HdfsStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/main/java/org/apache/dolphinscheduler/plugin/storage/hdfs/HdfsStorageOperator.java
index 0d21b769a9..3a1092077b 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/main/java/org/apache/dolphinscheduler/plugin/storage/hdfs/HdfsStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/main/java/org/apache/dolphinscheduler/plugin/storage/hdfs/HdfsStorageOperator.java
@@ -268,7 +268,6 @@ public class HdfsStorageOperator extends 
AbstractStorageOperator implements Clos
         Path fileStatusPath = fileStatus.getPath();
         String fileAbsolutePath = fileStatusPath.toString();
         ResourceMetadata resourceMetaData = 
getResourceMetaData(fileAbsolutePath);
-
         return StorageEntity.builder()
                 .fileName(fileStatusPath.getName())
                 .fullName(fileAbsolutePath)
@@ -276,6 +275,7 @@ public class HdfsStorageOperator extends 
AbstractStorageOperator implements Clos
                 .type(resourceMetaData.getResourceType())
                 .isDirectory(fileStatus.isDirectory())
                 .size(fileStatus.getLen())
+                .relativePath(resourceMetaData.getResourceRelativePath())
                 .createTime(new Date(fileStatus.getModificationTime()))
                 .updateTime(new Date(fileStatus.getModificationTime()))
                 .build();
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/test/java/org/apache/dolphinscheduler/plugin/storage/hdfs/LocalStorageOperatorTest.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/test/java/org/apache/dolphinscheduler/plugin/storage/hdfs/LocalStorageOperatorTest.java
index 5730f46dbd..899f17873a 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/test/java/org/apache/dolphinscheduler/plugin/storage/hdfs/LocalStorageOperatorTest.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-hdfs/src/test/java/org/apache/dolphinscheduler/plugin/storage/hdfs/LocalStorageOperatorTest.java
@@ -20,7 +20,6 @@ package org.apache.dolphinscheduler.plugin.storage.hdfs;
 import static com.google.common.truth.Truth.assertThat;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.apache.dolphinscheduler.common.constants.Constants;
 import org.apache.dolphinscheduler.common.utils.FileUtils;
 import org.apache.dolphinscheduler.plugin.storage.api.ResourceMetadata;
 import org.apache.dolphinscheduler.plugin.storage.api.StorageEntity;
@@ -47,7 +46,7 @@ class LocalStorageOperatorTest {
             
Paths.get(LocalStorageOperatorTest.class.getResource("/").getFile(), 
"localStorage").toString();
     private static final String tenantCode = "default";
     private static final String baseDir =
-            Paths.get(resourceBaseDir, tenantCode, 
StorageConstants.RESOURCE_TYPE_FILE).toString();
+            Paths.get(resourceBaseDir, tenantCode, 
StorageOperator.FILE_FOLDER_NAME).toString();
 
     @SneakyThrows
     @BeforeEach
@@ -116,7 +115,7 @@ class LocalStorageOperatorTest {
     public void testGetStorageBaseDirectory_withTenant_withResourceTypeFile() {
         String storageBaseDirectory = 
storageOperator.getStorageBaseDirectory("default", ResourceType.FILE);
         assertThat(storageBaseDirectory)
-                .isEqualTo("file:" + Paths.get(resourceBaseDir, tenantCode, 
Constants.RESOURCE_TYPE_FILE));
+                .isEqualTo("file:" + Paths.get(resourceBaseDir, tenantCode, 
StorageOperator.FILE_FOLDER_NAME));
     }
 
     @Test
@@ -143,21 +142,21 @@ class LocalStorageOperatorTest {
     public void testGetStorageFileAbsolutePath() {
         String fileAbsolutePath = 
storageOperator.getStorageFileAbsolutePath("default", "test.sh");
         assertThat(fileAbsolutePath).isEqualTo(
-                "file:" + Paths.get(resourceBaseDir, tenantCode, 
Constants.RESOURCE_TYPE_FILE, "test.sh"));
+                "file:" + Paths.get(resourceBaseDir, tenantCode, 
StorageOperator.FILE_FOLDER_NAME, "test.sh"));
     }
 
     @SneakyThrows
     @Test
     public void testCreateStorageDir_notExists() {
         String testDirFileAbsolutePath =
-                "file:" + Paths.get(resourceBaseDir, "root", 
Constants.RESOURCE_TYPE_FILE, "testDir");
+                "file:" + Paths.get(resourceBaseDir, "root", 
StorageOperator.FILE_FOLDER_NAME, "testDir");
         try {
             storageOperator.createStorageDir(testDirFileAbsolutePath);
             StorageEntity storageEntity = 
storageOperator.getStorageEntity(testDirFileAbsolutePath);
             
assertThat(storageEntity.getFullName()).isEqualTo(testDirFileAbsolutePath);
             assertThat(storageEntity.getFileName()).isEqualTo("testDir");
             assertThat(storageEntity.getPfullName())
-                    .isEqualTo("file:" + Paths.get(resourceBaseDir, "root", 
Constants.RESOURCE_TYPE_FILE));
+                    .isEqualTo("file:" + Paths.get(resourceBaseDir, "root", 
StorageOperator.FILE_FOLDER_NAME));
             assertThat(storageEntity.isDirectory()).isTrue();
             assertThat(storageEntity.getType()).isEqualTo(ResourceType.FILE);
         } finally {
@@ -169,7 +168,7 @@ class LocalStorageOperatorTest {
     @Test
     public void testCreateStorageDir_exists() {
         String testDirFileAbsolutePath =
-                "file:" + Paths.get(resourceBaseDir, "default", 
Constants.RESOURCE_TYPE_FILE, "sqlDirectory");
+                "file:" + Paths.get(resourceBaseDir, "default", 
StorageOperator.FILE_FOLDER_NAME, "sqlDirectory");
         assertThrows(FileAlreadyExistsException.class, () -> 
storageOperator.createStorageDir(testDirFileAbsolutePath));
     }
 
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-obs/src/main/java/org/apache/dolphinscheduler/plugin/storage/obs/ObsStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-obs/src/main/java/org/apache/dolphinscheduler/plugin/storage/obs/ObsStorageOperator.java
index 1f32cb34af..129b9a8828 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-obs/src/main/java/org/apache/dolphinscheduler/plugin/storage/obs/ObsStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-obs/src/main/java/org/apache/dolphinscheduler/plugin/storage/obs/ObsStorageOperator.java
@@ -260,6 +260,7 @@ public class ObsStorageOperator extends 
AbstractStorageOperator implements Close
                 .type(resourceMetaData.getResourceType())
                 .isDirectory(StringUtils.isEmpty(fileExtension))
                 .size(metadata.getContentLength())
+                .relativePath(resourceMetaData.getResourceRelativePath())
                 .createTime(metadata.getLastModified())
                 .updateTime(metadata.getLastModified())
                 .build();
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-oss/src/main/java/org/apache/dolphinscheduler/plugin/storage/oss/OssStorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-oss/src/main/java/org/apache/dolphinscheduler/plugin/storage/oss/OssStorageOperator.java
index 4b142466ce..0b78ce49b4 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-oss/src/main/java/org/apache/dolphinscheduler/plugin/storage/oss/OssStorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-oss/src/main/java/org/apache/dolphinscheduler/plugin/storage/oss/OssStorageOperator.java
@@ -331,6 +331,7 @@ public class OssStorageOperator extends 
AbstractStorageOperator implements Close
         storageEntity.setType(resourceMetaData.getResourceType());
         storageEntity.setDirectory(resourceMetaData.isDirectory());
         
storageEntity.setSize(ossObject.getObjectMetadata().getContentLength());
+        
storageEntity.setRelativePath(resourceMetaData.getResourceRelativePath());
         
storageEntity.setCreateTime(ossObject.getObjectMetadata().getLastModified());
         
storageEntity.setUpdateTime(ossObject.getObjectMetadata().getLastModified());
         return storageEntity;
diff --git 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-s3/src/main/java/org/apache/dolphinscheduler/plugin/storage/s3/S3StorageOperator.java
 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-s3/src/main/java/org/apache/dolphinscheduler/plugin/storage/s3/S3StorageOperator.java
index 2bd479de63..d1836d7c94 100644
--- 
a/dolphinscheduler-storage-plugin/dolphinscheduler-storage-s3/src/main/java/org/apache/dolphinscheduler/plugin/storage/s3/S3StorageOperator.java
+++ 
b/dolphinscheduler-storage-plugin/dolphinscheduler-storage-s3/src/main/java/org/apache/dolphinscheduler/plugin/storage/s3/S3StorageOperator.java
@@ -294,6 +294,7 @@ public class S3StorageOperator extends 
AbstractStorageOperator implements Closea
         entity.setDirectory(resourceMetaData.isDirectory());
         entity.setType(resourceMetaData.getResourceType());
         entity.setSize(object.getObjectMetadata().getContentLength());
+        entity.setRelativePath(resourceMetaData.getResourceRelativePath());
         entity.setCreateTime(object.getObjectMetadata().getLastModified());
         entity.setUpdateTime(object.getObjectMetadata().getLastModified());
         return entity;
diff --git 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-resources.ts
 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-resources.ts
index f9fa187314..ae9020534a 100644
--- 
a/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-resources.ts
+++ 
b/dolphinscheduler-ui/src/views/projects/task/components/node/fields/use-resources.ts
@@ -15,12 +15,15 @@
  * limitations under the License.
  */
 
-import { ref, onMounted, Ref, isRef } from 'vue'
+import { ref, onMounted, Ref, isRef, h } from 'vue'
 import { useI18n } from 'vue-i18n'
 import { queryResourceList } from '@/service/modules/resources'
 import { useTaskNodeStore } from '@/store/project/task-node'
 import utils from '@/utils'
 import type { IJsonItem, IResource } from '../types'
+import { NButton, NIcon, NTag } from 'naive-ui'
+import { CopyOutlined } from '@vicons/antd'
+import { useClipboard } from '@vueuse/core'
 
 export function useResources(
   span: number | Ref<number> = 24,
@@ -42,6 +45,9 @@ export function useResources(
 
   const taskStore = useTaskNodeStore()
 
+  const source = ref('Hello')
+  const { copy, isSupported } = useClipboard({ source })
+
   const getResources = async () => {
     if (taskStore.resources.length) {
       resourcesOptions.value = taskStore.resources
@@ -116,6 +122,16 @@ export function useResources(
     }
   }
 
+  const copyResourceName = async (name: string) => {
+    if (isSupported.value) {
+      event?.stopPropagation()
+      await copy(name)
+      window.$message.success(t('project.node.copy_success'))
+    } else {
+      window.$message.error(t('project.node.copy_failed'))
+    }
+  }
+
   onMounted(() => {
     getResources()
   })
@@ -139,7 +155,44 @@ export function useResources(
       keyField: 'fullName',
       labelField: 'name',
       disabledField: 'disable',
-      loading: resourcesLoading
+      loading: resourcesLoading,
+      'render-tag': ({
+        option,
+        handleClose
+      }: {
+        option: any
+        handleClose: any
+      }) => {
+        return h(
+          NTag,
+          {
+            type: 'success',
+            closable: true,
+            onClose: () => {
+              handleClose()
+            }
+          },
+          {
+            default: () => option.currentDir,
+            avatar: () =>
+              h(
+                NButton,
+                {
+                  tag: 'div',
+                  type: 'info',
+                  size: 'tiny',
+                  onClick: () => copyResourceName(option.currentDir)
+                },
+                {
+                  icon: () =>
+                    h(NIcon, null, {
+                      default: () => h(CopyOutlined)
+                    })
+                }
+              )
+          }
+        )
+      }
     },
     validate: {
       trigger: ['blur'],

Reply via email to