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

songjian 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 f262441  [Feature][UI Next] Add relation custom params component into 
task. (#8551)
f262441 is described below

commit f262441d38cfd40bfc6ecad2fe36149d3f90b678
Author: Amy0104 <[email protected]>
AuthorDate: Sat Feb 26 09:30:05 2022 +0800

    [Feature][UI Next] Add relation custom params component into task. (#8551)
---
 .../components/form/fields/custom-parameters.ts    | 53 +++++++++---
 .../src/components/form/fields/switch.ts           | 16 ++--
 .../src/components/form/types.ts                   |  2 +
 .../src/locales/modules/en_US.ts                   |  4 +-
 .../src/locales/modules/zh_CN.ts                   |  4 +-
 .../projects/task/components/node/fields/index.ts  |  1 +
 .../components/node/fields/use-custom-params.ts    |  4 +-
 .../task/components/node/fields/use-http.ts        |  2 +-
 .../node/fields/use-relation-custom-params.ts      | 99 ++++++++++++++++++++++
 .../task/components/node/fields/use-task-type.ts   |  4 +-
 .../task/components/node/index.module.scss         | 21 +++++
 11 files changed, 186 insertions(+), 24 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 2460ee7..0003ed6 100644
--- a/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts
+++ b/dolphinscheduler-ui-next/src/components/form/fields/custom-parameters.ts
@@ -58,27 +58,57 @@ const CustomParameters = defineComponent({
   }
 })
 
+const getDefaultValue = (children: IJsonItem[]) => {
+  const defaultValue: { [field: string]: any } = {}
+  const ruleItem: { [key: string]: FormItemRule[] | FormItemRule } = {}
+  const loop = (
+    children: IJsonItem[],
+    parent: { [field: string]: any },
+    ruleParent: { [key: string]: FormItemRule[] | FormItemRule }
+  ) => {
+    children.forEach((child) => {
+      if (Array.isArray(child.children)) {
+        const childDefaultValue = {}
+        const childRuleItem = {}
+        loop(child.children, childDefaultValue, childRuleItem)
+        parent[child.field] = [childDefaultValue]
+        ruleParent[child.field] = {
+          type: 'array',
+          fields: childRuleItem
+        }
+        return
+      } else {
+        parent[child.field] = child.value || null
+        if (child.validate)
+          ruleParent[child.field] = formatValidate(child.validate)
+      }
+    })
+  }
+
+  loop(children, defaultValue, ruleItem)
+  return {
+    defaultValue,
+    ruleItem
+  }
+}
+
 export function renderCustomParameters(
   item: IJsonItem,
   fields: { [field: string]: any },
-  rules: { [key: string]: FormItemRule }[]
+  rules: { [key: string]: FormItemRule | FormItemRule[] }[]
 ) {
   const { field, children = [] } = item
-  let defaultValue: { [field: string]: any } = {}
-  let ruleItem: { [key: string]: FormItemRule } = {}
-
-  children.forEach((child) => {
-    defaultValue[child.field] = child.value || null
-    if (child.validate) ruleItem[child.field] = formatValidate(child.validate)
-  })
-  const getChild = (item: object, i: number) =>
+  const { defaultValue, ruleItem } = getDefaultValue(children)
+  rules.push(ruleItem)
+  const getChild = (item: object, i: number, disabled: boolean) =>
     children.map((child: IJsonItem) => {
       return h(
         NFormItemGi,
         {
           showLabel: false,
           path: `${field}[${i}].${child.field}`,
-          span: unref(child.span)
+          span: unref(child.span),
+          class: child.class
         },
         () => getField(child, item)
       )
@@ -86,7 +116,7 @@ export function renderCustomParameters(
   const getChildren = ({ disabled }: { disabled: boolean }) =>
     fields[field].map((item: object, i: number) => {
       return h(NGrid, { xGap: 10 }, () => [
-        ...getChild(item, i),
+        ...getChild(item, i, disabled),
         h(
           NGridItem,
           {
@@ -112,7 +142,6 @@ export function renderCustomParameters(
         )
       ])
     })
-
   return h(
     CustomParameters,
     {
diff --git a/dolphinscheduler-ui-next/src/components/form/fields/switch.ts 
b/dolphinscheduler-ui-next/src/components/form/fields/switch.ts
index a1c363a..c1f7772 100644
--- a/dolphinscheduler-ui-next/src/components/form/fields/switch.ts
+++ b/dolphinscheduler-ui-next/src/components/form/fields/switch.ts
@@ -23,10 +23,14 @@ export function renderSwitch(
   item: IJsonItem,
   fields: { [field: string]: any }
 ) {
-  const { props, field } = item
-  return h(NSwitch, {
-    ...props,
-    value: fields[field],
-    onUpdateValue: (value: string) => void (fields[field] = value)
-  })
+  const { props, field, slots = {} } = item
+  return h(
+    NSwitch,
+    {
+      ...props,
+      value: fields[field],
+      onUpdateValue: (value: string) => void (fields[field] = value)
+    },
+    { ...slots }
+  )
 }
diff --git a/dolphinscheduler-ui-next/src/components/form/types.ts 
b/dolphinscheduler-ui-next/src/components/form/types.ts
index 7c164c9..402f8a6 100644
--- a/dolphinscheduler-ui-next/src/components/form/types.ts
+++ b/dolphinscheduler-ui-next/src/components/form/types.ts
@@ -49,6 +49,7 @@ interface IFormItem {
   widget: any
   span?: number | Ref<number>
   type?: 'custom'
+  class?: string
 }
 
 interface IMeta extends Omit<FormProps, 'model'> {
@@ -69,6 +70,7 @@ interface IJsonItem {
   slots?: object
   span?: number | Ref<number>
   widget?: any
+  class?: string
 }
 
 export {
diff --git a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts 
b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
index 147c400..53dd410 100644
--- a/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
+++ b/dolphinscheduler-ui-next/src/locales/modules/en_US.ts
@@ -771,7 +771,9 @@ const project = {
     sea_tunnel_master_url_tips:
       'Please enter the master url, e.g., 127.0.0.1:7077',
     switch_condition: 'Condition',
-    switch_branch_flow: 'Branch Flow'
+    switch_branch_flow: 'Branch Flow',
+    and: 'and',
+    or: 'or'
   }
 }
 
diff --git a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts 
b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
index ca952c2..678bfad 100644
--- a/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
+++ b/dolphinscheduler-ui-next/src/locales/modules/zh_CN.ts
@@ -762,7 +762,9 @@ const project = {
     sea_tunnel_queue: '队列',
     sea_tunnel_master_url_tips: '请直接填写地址,例如:127.0.0.1:7077',
     switch_condition: '条件',
-    switch_branch_flow: '分支流转'
+    switch_branch_flow: '分支流转',
+    and: '且',
+    or: '或'
   }
 }
 
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts
index bc84d5f..95f4886 100644
--- 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/index.ts
@@ -37,6 +37,7 @@ export { useProcedure } from './use-procedure'
 export { useCustomParams } from './use-custom-params'
 export { useSourceType } from './use-sqoop-source-type'
 export { useTargetType } from './use-sqoop-target-type'
+export { useRelationCustomParams } from './use-relation-custom-params'
 
 export { useShell } from './use-shell'
 export { useSpark } from './use-spark'
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-custom-params.ts
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-custom-params.ts
index fb898a3..6026028 100644
--- 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-custom-params.ts
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-custom-params.ts
@@ -57,7 +57,7 @@ export function useCustomParams({
                   return new Error(t('project.node.prop_tips'))
                 }
 
-                const sameItems = model.localParams.filter(
+                const sameItems = model[field].filter(
                   (item: { prop: string }) => item.prop === value
                 )
 
@@ -103,7 +103,7 @@ export function useCustomParams({
                   return new Error(t('project.node.prop_tips'))
                 }
 
-                const sameItems = model.localParams.filter(
+                const sameItems = model[field].filter(
                   (item: { prop: string }) => item.prop === value
                 )
 
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-http.ts
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-http.ts
index 4a8396b..963cb19 100644
--- 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-http.ts
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-http.ts
@@ -88,7 +88,7 @@ export function useHttp(model: { [field: string]: any }): 
IJsonItem[] {
                 return new Error(t('project.node.prop_tips'))
               }
 
-              const sameItems = model.localParams.filter(
+              const sameItems = model.httpParams.filter(
                 (item: { prop: string }) => item.prop === value
               )
 
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-relation-custom-params.ts
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-relation-custom-params.ts
new file mode 100644
index 0000000..ad4c740
--- /dev/null
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-relation-custom-params.ts
@@ -0,0 +1,99 @@
+/*
+ * 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 { computed, h, watchEffect } from 'vue'
+import { useI18n } from 'vue-i18n'
+import { NButton } from 'naive-ui'
+import styles from '../index.module.scss'
+import type { IJsonItem } from '../types'
+
+export function useRelationCustomParams({
+  model,
+  children,
+  childrenField
+}: {
+  model: {
+    [field: string]: any
+  }
+  children: IJsonItem
+  childrenField: string
+}): IJsonItem[] {
+  const { t } = useI18n()
+  const firstLevelRelationSpan = computed(() =>
+    model.dependTaskList.length ? 3 : 0
+  )
+
+  watchEffect(() => {
+    model.dependTaskList.forEach(
+      (item: { [childrenField: string]: [] }, i: number) => {
+        if (item[childrenField].length === 0) {
+          model.dependTaskList.splice(i, 1)
+        }
+      }
+    )
+  })
+  console.log(model.relation)
+  return [
+    {
+      type: 'custom',
+      name: t('project.node.custom_parameters'),
+      field: 'relationLabel',
+      span: 24,
+      class: styles['relaction-label']
+    },
+    {
+      type: 'switch',
+      field: 'relation',
+      props: {
+        round: false,
+        'checked-value': 'AND',
+        'unchecked-value': 'OR',
+        size: 'small'
+      },
+      slots: {
+        checked: () => t('project.node.and'),
+        unchecked: () => t('project.node.or')
+      },
+      span: firstLevelRelationSpan,
+      class: styles['relaction-switch']
+    },
+    {
+      type: 'custom-parameters',
+      field: 'dependTaskList',
+      span: 20,
+      children: [
+        {
+          type: 'switch',
+          field: 'relation',
+          props: {
+            round: false,
+            'checked-value': 'AND',
+            'unchecked-value': 'OR',
+            size: 'small'
+          },
+          slots: {
+            checked: () => t('project.node.and'),
+            unchecked: () => t('project.node.or')
+          },
+          span: 4,
+          value: 'AND',
+          class: styles['relaction-switch']
+        },
+        children
+      ]
+    }
+  ]
+}
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-task-type.ts
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-task-type.ts
index 026cd97..cbd50f4 100644
--- 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-task-type.ts
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/fields/use-task-type.ts
@@ -24,10 +24,12 @@ export function useTaskType(
   readonly?: boolean
 ): IJsonItem {
   const { t } = useI18n()
+  const disabledTaskType = ['CONDITIONS', 'SWITCH']
 
   const options = Object.keys(TASK_TYPES_MAP).map((option: string) => ({
     label: option,
-    value: option
+    value: option,
+    disabled: disabledTaskType.includes(option)
   }))
   return {
     type: 'select',
diff --git 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/index.module.scss
 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/index.module.scss
index 5d4d0c3..8fc6ada 100644
--- 
a/dolphinscheduler-ui-next/src/views/projects/task/components/node/index.module.scss
+++ 
b/dolphinscheduler-ui-next/src/views/projects/task/components/node/index.module.scss
@@ -30,3 +30,24 @@
     margin-right: 8px;
   }
 }
+.relaction-label {
+  height: 30px;
+  overflow: hidden;
+}
+.relaction-switch {
+  position: relative;
+  cursor: pointer;
+  display: flex;
+  align-items: center;
+  &::before {
+    content: '';
+    display: block;
+    width: 4px;
+    height: 100%;
+    background-color: var(--n-color);
+    border-radius: 4px;
+    position: absolute;
+    top: 0px;
+    left: 20px;
+  }
+}

Reply via email to