You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@dolphinscheduler.apache.org by li...@apache.org on 2022/04/29 08:00:16 UTC

[dolphinscheduler] branch dev updated: [Fix][UI Next][V1.0.0-Beta] Add validation rules to dependency of the dependent task. (#9844)

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

liudongkai 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 f747b606e9 [Fix][UI Next][V1.0.0-Beta] Add validation rules to dependency of the dependent task. (#9844)
f747b606e9 is described below

commit f747b606e985836c734da23509c74c3b95f542b7
Author: Amy0104 <97...@users.noreply.github.com>
AuthorDate: Fri Apr 29 16:00:10 2022 +0800

    [Fix][UI Next][V1.0.0-Beta] Add validation rules to dependency of the dependent task. (#9844)
---
 .../components/form/fields/custom-parameters.ts    |  5 +-
 .../src/components/form/types.ts                   |  2 +
 .../src/locales/modules/en_US.ts                   |  8 ++-
 .../src/locales/modules/zh_CN.ts                   |  5 ++
 .../task/components/node/fields/use-dependent.ts   | 59 ++++++++++++++--
 .../task/components/node/fields/use-deploy-mode.ts | 80 +++++++++++-----------
 .../task/components/node/fields/use-main-jar.ts    |  4 +-
 .../projects/task/components/node/fields/use-mr.ts |  2 +-
 .../task/components/node/fields/use-spark.ts       | 20 +++---
 .../task/components/node/tasks/use-zeppelin.ts     |  2 +-
 .../workflow/components/dag/use-node-search.ts     |  4 +-
 11 files changed, 127 insertions(+), 64 deletions(-)

diff --git a/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts b/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts
index a04302e420..83890f708c 100644
--- a/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts
+++ b/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts
@@ -111,10 +111,11 @@ export function renderCustomParameters(
         NFormItemGi,
         {
           showLabel: !!mergedChild.name,
-          path: `${field}[${i}].${mergedChild.field}`,
+          path: mergedChild.path || `${field}[${i}].${mergedChild.field}`,
           label: mergedChild.name,
           span: unref(mergedChild.span),
-          class: mergedChild.class
+          class: mergedChild.class,
+          rule: mergedChild.rule
         },
         () => getField(mergedChild, item)
       )
diff --git a/dolphinscheduler-ui-next/src/components/form/types.ts b/dolphinscheduler-ui-next/src/components/form/types.ts
index 6be131bea9..86ff07da31 100644
--- a/dolphinscheduler-ui-next/src/components/form/types.ts
+++ b/dolphinscheduler-ui-next/src/components/form/types.ts
@@ -69,6 +69,8 @@ interface IJsonItemParams {
   span?: number | Ref<number>
   widget?: any
   class?: string
+  path?: string
+  rule?: FormItemRule
 }
 
 type IJsonItemFn = (i?: number) => IJsonItemParams
diff --git a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
index 6a30e88245..8be53ab7b3 100644
--- a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
+++ b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
@@ -625,6 +625,7 @@ const project = {
     enter_this_child_node: 'Enter this child node',
     name: 'Node Name',
     task_name: 'Task Name',
+    task_name_tips: 'Please select a task (required)',
     name_tips: 'Please enter name (required)',
     task_type: 'Task Type',
     task_type_tips: 'Please select a task type (required)',
@@ -874,8 +875,12 @@ const project = {
     check_interval: 'Check interval',
     waiting_dependent_complete: 'Waiting Dependent complete',
     project_name: 'Project Name',
+    project_name_tips: 'Please select a project(required)',
     process_name: 'Workflow Name',
+    process_name_tips: 'Please select a workflow(required)',
     cycle_time: 'Cycle Time',
+    cycle_time_tips: 'Please select a cycle time(required)',
+    date_tips: 'Please select a date(required)',
     rule_name: 'Rule Name',
     null_check: 'NullCheck',
     custom_sql: 'CustomSql',
@@ -923,7 +928,8 @@ const project = {
     zeppelin_note_id: 'zeppelinNoteId',
     zeppelin_note_id_tips: 'Please enter the note id of your zeppelin note',
     zeppelin_paragraph_id: 'zeppelinParagraphId',
-    zeppelin_paragraph_id_tips: 'Please enter the paragraph id of your zeppelin paragraph',
+    zeppelin_paragraph_id_tips:
+      'Please enter the paragraph id of your zeppelin paragraph',
     send_email: 'Send Email',
     log_display: 'Log display',
     rows_of_result: 'rows of result',
diff --git a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
index a5990c07e9..3f898a7943 100644
--- a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
+++ b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
@@ -621,6 +621,7 @@ const project = {
     enter_this_child_node: '进入该子节点',
     name: '节点名称',
     task_name: '任务名称',
+    task_name_tips: '任务名称(必填)',
     name_tips: '请输入名称(必填)',
     task_type: '任务类型',
     task_type_tips: '请选择任务类型(必选)',
@@ -863,8 +864,12 @@ const project = {
     check_interval: '检查间隔',
     waiting_dependent_complete: '等待依赖完成',
     project_name: '项目名称',
+    project_name_tips: '项目名称(必填)',
     process_name: '工作流名称',
+    process_name_tips: '工作流名称(必填)',
     cycle_time: '时间周期',
+    cycle_time_tips: '时间周期(必填)',
+    date_tips: '日期(必填)',
     rule_name: '规则名称',
     null_check: '空值检测',
     custom_sql: '自定义SQL',
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-dependent.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-dependent.ts
index 6f03339eb4..1a149484f9 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-dependent.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-dependent.ts
@@ -281,7 +281,17 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
                 item.definitionCode = null
               }
             },
-            options: projectList
+            options: projectList,
+            path: `dependTaskList.${i}.dependItemList.${j}.projectCode`,
+            rule: {
+              required: true,
+              trigger: ['input', 'blur'],
+              validator(validate: any, value: string) {
+                if (!value) {
+                  return Error(t('project.node.project_name_tips'))
+                }
+              }
+            }
           }),
           (j = 0) => ({
             type: 'select',
@@ -301,7 +311,17 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
             },
             options:
               model.dependTaskList[i]?.dependItemList[j]
-                ?.definitionCodeOptions || []
+                ?.definitionCodeOptions || [],
+            path: `dependTaskList.${i}.dependItemList.${j}.definitionCode`,
+            rule: {
+              required: true,
+              trigger: ['input', 'blur'],
+              validator(validate: any, value: string) {
+                if (!value) {
+                  return Error(t('project.node.process_name_tips'))
+                }
+              }
+            }
           }),
           (j = 0) => ({
             type: 'select',
@@ -313,7 +333,17 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
             },
             options:
               model.dependTaskList[i]?.dependItemList[j]?.depTaskCodeOptions ||
-              []
+              [],
+            path: `dependTaskList.${i}.dependItemList.${j}.depTaskCode`,
+            rule: {
+              required: true,
+              trigger: ['input', 'blur'],
+              validator(validate: any, value: string) {
+                if (!value) {
+                  return Error(t('project.node.task_name_tips'))
+                }
+              }
+            }
           }),
           (j = 0) => ({
             type: 'select',
@@ -326,7 +356,17 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
                   DATE_LSIT[value]
               }
             },
-            options: CYCLE_LIST
+            options: CYCLE_LIST,
+            path: `dependTaskList.${i}.dependItemList.${j}.cycle`,
+            rule: {
+              required: true,
+              trigger: ['input', 'blur'],
+              validator(validate: any, value: string) {
+                if (!value) {
+                  return Error(t('project.node.cycle_time_tips'))
+                }
+              }
+            }
           }),
           (j = 0) => ({
             type: 'select',
@@ -334,7 +374,16 @@ export function useDependent(model: { [field: string]: any }): IJsonItem[] {
             span: 10,
             name: ' ',
             options:
-              model.dependTaskList[i]?.dependItemList[j]?.dateOptions || []
+              model.dependTaskList[i]?.dependItemList[j]?.dateOptions || [],
+            path: `dependTaskList.${i}.dependItemList.${j}.dateValue`,
+            rule: {
+              trigger: ['input', 'blur'],
+              validator(validate: any, value: string) {
+                if (!value) {
+                  return Error(t('project.node.date_tips'))
+                }
+              }
+            }
           }),
           (j = 0) => ({
             type: 'custom',
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-deploy-mode.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-deploy-mode.ts
index 8f87d1cfb2..a767d084c0 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-deploy-mode.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-deploy-mode.ts
@@ -14,49 +14,51 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import {ref, watchEffect} from 'vue'
-import {useI18n} from 'vue-i18n'
-import type {IJsonItem, IOption} from '../types'
+import { ref, watchEffect } from 'vue'
+import { useI18n } from 'vue-i18n'
+import type { IJsonItem, IOption } from '../types'
 
-export function useDeployMode(span = 24, showClient = ref(true), showCluster = ref(true)): IJsonItem {
-    const {t} = useI18n()
+export function useDeployMode(
+  span = 24,
+  showClient = ref(true),
+  showCluster = ref(true)
+): IJsonItem {
+  const { t } = useI18n()
 
-    const deployModeOptions = ref(DEPLOY_MODES as IOption[])
+  const deployModeOptions = ref(DEPLOY_MODES as IOption[])
 
-    watchEffect(
-        () => {
-            deployModeOptions.value = DEPLOY_MODES.filter((option) => {
-                switch (option.value) {
-                    case 'cluster':
-                        return showCluster.value
-                    case 'client':
-                        return showClient.value
-                    default:
-                        return true
-                }
-            })
-        }
-    )
-    return {
-        type: 'radio',
-        field: 'deployMode',
-        name: t('project.node.deploy_mode'),
-        options: deployModeOptions,
-        span
-    }
+  watchEffect(() => {
+    deployModeOptions.value = DEPLOY_MODES.filter((option) => {
+      switch (option.value) {
+        case 'cluster':
+          return showCluster.value
+        case 'client':
+          return showClient.value
+        default:
+          return true
+      }
+    })
+  })
+  return {
+    type: 'radio',
+    field: 'deployMode',
+    name: t('project.node.deploy_mode'),
+    options: deployModeOptions,
+    span
+  }
 }
 
 export const DEPLOY_MODES = [
-    {
-        label: 'cluster',
-        value: 'cluster'
-    },
-    {
-        label: 'client',
-        value: 'client'
-    },
-    {
-        label: 'local',
-        value: 'local'
-    }
+  {
+    label: 'cluster',
+    value: 'cluster'
+  },
+  {
+    label: 'client',
+    value: 'client'
+  },
+  {
+    label: 'local',
+    value: 'local'
+  }
 ]
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-main-jar.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-main-jar.ts
index e8008a6a3f..263e4ce153 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-main-jar.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-main-jar.ts
@@ -26,9 +26,7 @@ export function useMainJar(model: { [field: string]: any }): IJsonItem {
   const mainJarOptions = ref([] as IMainJar[])
   const taskStore = useTaskNodeStore()
 
-  const mainJarSpan = computed(() =>
-      model.programType === 'SQL' ? 0 : 24
-  )
+  const mainJarSpan = computed(() => (model.programType === 'SQL' ? 0 : 24))
   const getMainJars = async (programType: ProgramType) => {
     const storeMainJar = taskStore.getMainJar(programType)
     if (storeMainJar) {
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-mr.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-mr.ts
index 76b89b342d..83c9996529 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-mr.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-mr.ts
@@ -23,7 +23,7 @@ export function useMr(model: { [field: string]: any }): IJsonItem[] {
   const { t } = useI18n()
 
   const mainClassSpan = computed(() =>
-      (model.programType === 'PYTHON' || model.programType === 'SQL') ? 0 : 24
+    model.programType === 'PYTHON' || model.programType === 'SQL' ? 0 : 24
   )
 
   return [
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-spark.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-spark.ts
index b28aa359ac..fdce98a16e 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-spark.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-spark.ts
@@ -32,20 +32,14 @@ import type { IJsonItem } from '../types'
 export function useSpark(model: { [field: string]: any }): IJsonItem[] {
   const { t } = useI18n()
   const mainClassSpan = computed(() =>
-      (model.programType === 'PYTHON' || model.programType === 'SQL') ? 0 : 24
+    model.programType === 'PYTHON' || model.programType === 'SQL' ? 0 : 24
   )
 
-  const mainArgsSpan = computed(() =>
-      model.programType === 'SQL' ? 0 : 24
-  )
+  const mainArgsSpan = computed(() => (model.programType === 'SQL' ? 0 : 24))
 
-  const rawScriptSpan = computed(() =>
-      model.programType === 'SQL' ? 24 : 0
-  )
+  const rawScriptSpan = computed(() => (model.programType === 'SQL' ? 24 : 0))
 
-  const showCluster = computed(() =>
-      model.programType !== 'SQL'
-  )
+  const showCluster = computed(() => model.programType !== 'SQL')
 
   return [
     {
@@ -80,7 +74,11 @@ export function useSpark(model: { [field: string]: any }): IJsonItem[] {
         trigger: ['input', 'blur'],
         required: model.programType !== 'PYTHON' && model.programType !== 'SQL',
         validator(validate: any, value: string) {
-          if (model.programType !== 'PYTHON' && !value && model.programType !== 'SQL') {
+          if (
+            model.programType !== 'PYTHON' &&
+            !value &&
+            model.programType !== 'SQL'
+          ) {
             return new Error(t('project.node.main_class_tips'))
           }
         }
diff --git a/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-zeppelin.ts b/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-zeppelin.ts
index 226543f23a..7e96d46d12 100644
--- a/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-zeppelin.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/task/components/node/tasks/use-zeppelin.ts
@@ -17,7 +17,7 @@
 
 import { reactive } from 'vue'
 import * as Fields from '../fields/index'
-import type { IJsonItem, INodeData, ITaskData  } from '../types'
+import type { IJsonItem, INodeData, ITaskData } from '../types'
 
 export function useZeppelin({
   projectCode,
diff --git a/dolphinscheduler-ui-next/src/views/projects/workflow/components/dag/use-node-search.ts b/dolphinscheduler-ui-next/src/views/projects/workflow/components/dag/use-node-search.ts
index 62e0f129c2..d3e61bf9dd 100644
--- a/dolphinscheduler-ui-next/src/views/projects/workflow/components/dag/use-node-search.ts
+++ b/dolphinscheduler-ui-next/src/views/projects/workflow/components/dag/use-node-search.ts
@@ -48,7 +48,9 @@ export function useNodeSearch(options: Options) {
       label: node.getData().taskName,
       value: node.id
     }))
-    const filterSelect = nodesDropdown.value.findIndex(item => item.value === searchSelectValue.value)
+    const filterSelect = nodesDropdown.value.findIndex(
+      (item) => item.value === searchSelectValue.value
+    )
     filterSelect === -1 && (searchSelectValue.value = '')
   }