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

chufenggao pushed a commit to branch 3.0.2-prepare
in repository https://gitbox.apache.org/repos/asf/dolphinscheduler.git


The following commit(s) were added to refs/heads/3.0.2-prepare by this push:
     new 8c3c94218b [Improvement][UI] Set the `required` to be reactive in the 
task modal. (#12225) (#12748)
8c3c94218b is described below

commit 8c3c94218b4d02ec61460619f3faea11fa9f7b8c
Author: Eric Gao <[email protected]>
AuthorDate: Mon Nov 7 11:33:25 2022 +0800

    [Improvement][UI] Set the `required` to be reactive in the task modal. 
(#12225) (#12748)
    
    Co-authored-by: Amy0104 <[email protected]>
---
 .../src/components/form/fields/custom-parameters.ts | 19 +++++++++++++------
 .../src/components/form/fields/get-field.ts         |  7 +++----
 .../src/components/form/fields/multi-condition.ts   |  7 +++----
 .../src/components/form/get-elements-by-json.ts     |  5 ++---
 dolphinscheduler-ui/src/components/form/index.tsx   |  4 ++--
 dolphinscheduler-ui/src/components/form/types.ts    | 21 +++++++++++++++++----
 dolphinscheduler-ui/src/components/form/utils.ts    |  8 ++++----
 .../views/security/alarm-instance-manage/detail.tsx |  4 ++--
 .../views/security/alarm-instance-manage/types.ts   | 10 +++++++---
 .../security/alarm-instance-manage/use-form.ts      |  6 +++---
 10 files changed, 56 insertions(+), 35 deletions(-)

diff --git 
a/dolphinscheduler-ui/src/components/form/fields/custom-parameters.ts 
b/dolphinscheduler-ui/src/components/form/fields/custom-parameters.ts
index fe38899318..49bb371b5f 100644
--- a/dolphinscheduler-ui/src/components/form/fields/custom-parameters.ts
+++ b/dolphinscheduler-ui/src/components/form/fields/custom-parameters.ts
@@ -17,12 +17,19 @@
 
 import { defineComponent, h, unref, renderSlot } from 'vue'
 import { useFormItem } from 'naive-ui/es/_mixins'
-import { NFormItemGi, NSpace, NButton, NGrid, NGridItem } from 'naive-ui'
+import {
+  NFormItemGi,
+  NSpace,
+  NButton,
+  NGrid,
+  NGridItem,
+  FormItemRule
+} from 'naive-ui'
 import { isFunction } from 'lodash'
 import { PlusOutlined, DeleteOutlined } from '@vicons/antd'
 import getField from './get-field'
 import { formatValidate } from '../utils'
-import type { IJsonItem, FormItemRule } from '../types'
+import type { IJsonItem, IFormItemRule } from '../types'
 
 const CustomParameters = defineComponent({
   name: 'CustomParameters',
@@ -66,11 +73,11 @@ const CustomParameters = defineComponent({
 
 const getDefaultValue = (children: IJsonItem[]) => {
   const defaultValue: { [field: string]: any } = {}
-  const ruleItem: { [key: string]: FormItemRule[] | FormItemRule } = {}
+  const ruleItem: { [key: string]: IFormItemRule[] | IFormItemRule } = {}
   const loop = (
     children: IJsonItem[],
     parent: { [field: string]: any },
-    ruleParent: { [key: string]: FormItemRule[] | FormItemRule }
+    ruleParent: { [key: string]: IFormItemRule[] | IFormItemRule }
   ) => {
     children.forEach((child) => {
       const mergedChild = isFunction(child) ? child() : child
@@ -102,7 +109,7 @@ const getDefaultValue = (children: IJsonItem[]) => {
 export function renderCustomParameters(
   item: IJsonItem,
   fields: { [field: string]: any },
-  rules: { [key: string]: FormItemRule | FormItemRule[] }[]
+  rules: { [key: string]: IFormItemRule | IFormItemRule[] }[]
 ) {
   const mergedItem = isFunction(item) ? item() : item
   const { field, children = [] } = mergedItem
@@ -119,7 +126,7 @@ export function renderCustomParameters(
           label: mergedChild.name,
           span: unref(mergedChild.span),
           class: mergedChild.class,
-          rule: mergedChild.rule
+          rule: mergedChild.rule as FormItemRule
         },
         () => getField(mergedChild, item)
       )
diff --git a/dolphinscheduler-ui/src/components/form/fields/get-field.ts 
b/dolphinscheduler-ui/src/components/form/fields/get-field.ts
index 8508985ec9..87550b4647 100644
--- a/dolphinscheduler-ui/src/components/form/fields/get-field.ts
+++ b/dolphinscheduler-ui/src/components/form/fields/get-field.ts
@@ -16,8 +16,7 @@
  */
 import * as Field from './index'
 import { camelCase, upperFirst, isFunction } from 'lodash'
-import type { FormRules, FormItemRule } from 'naive-ui'
-import type { IJsonItem } from '../types'
+import type { IJsonItem, IFormRules, IFormItemRule } from '../types'
 
 const TYPES = [
   'input',
@@ -37,7 +36,7 @@ const TYPES = [
 const getField = (
   item: IJsonItem,
   fields: { [field: string]: any },
-  rules?: FormRules
+  rules?: IFormRules
 ) => {
   const { type = 'input', widget, field } = isFunction(item) ? item() : item
   if (!TYPES.includes(type)) return null
@@ -47,7 +46,7 @@ const getField = (
   }
   // TODO Support other widgets later
   if (type === 'custom-parameters') {
-    let fieldRules: { [key: string]: FormItemRule }[] = []
+    let fieldRules: { [key: string]: IFormItemRule }[] = []
     if (rules && !rules[field]) fieldRules = rules[field] = []
     // @ts-ignore
     return Field[renderTypeName](item, fields, fieldRules)
diff --git a/dolphinscheduler-ui/src/components/form/fields/multi-condition.ts 
b/dolphinscheduler-ui/src/components/form/fields/multi-condition.ts
index 2859b0e992..e55c080866 100644
--- a/dolphinscheduler-ui/src/components/form/fields/multi-condition.ts
+++ b/dolphinscheduler-ui/src/components/form/fields/multi-condition.ts
@@ -20,7 +20,7 @@ import { useFormItem } from 'naive-ui/es/_mixins'
 import { NFormItemGi, NSpace, NButton, NGrid, NGridItem } from 'naive-ui'
 import { PlusOutlined, DeleteOutlined } from '@vicons/antd'
 import { isFunction } from 'lodash'
-import type { IJsonItem, FormItemRule } from '../types'
+import type { IJsonItem, IFormItemRule } from '../types'
 import getField from '@/components/form/fields/get-field'
 import { formatValidate } from '@/components/form/utils'
 
@@ -65,10 +65,9 @@ const MultiCondition = defineComponent({
 
 export function renderMultiCondition(
   item: IJsonItem,
-  fields: { [field: string]: any },
-  unused: { [key: string]: FormItemRule }[]
+  fields: { [field: string]: any }
 ) {
-  const ruleItem: { [key: string]: FormItemRule } = {}
+  const ruleItem: { [key: string]: IFormItemRule } = {}
 
   // the fields is the data of the task definition.
   // the item is the options of this component in the form.
diff --git a/dolphinscheduler-ui/src/components/form/get-elements-by-json.ts 
b/dolphinscheduler-ui/src/components/form/get-elements-by-json.ts
index 753bdb11e0..e1451cb0b4 100644
--- a/dolphinscheduler-ui/src/components/form/get-elements-by-json.ts
+++ b/dolphinscheduler-ui/src/components/form/get-elements-by-json.ts
@@ -19,14 +19,13 @@ import { toRef, Ref } from 'vue'
 import { formatValidate } from './utils'
 import getField from './fields/get-field'
 import { omit, isFunction } from 'lodash'
-import type { FormRules } from 'naive-ui'
-import type { IFormItem, IJsonItem } from './types'
+import type { IFormItem, IJsonItem, IFormRules } from './types'
 
 export default function getElementByJson(
   json: IJsonItem[],
   fields: { [field: string]: any }
 ) {
-  const rules: FormRules = {}
+  const rules: IFormRules = {}
   const initialValues: { [field: string]: any } = {}
   const elements: IFormItem[] = []
   for (const item of json) {
diff --git a/dolphinscheduler-ui/src/components/form/index.tsx 
b/dolphinscheduler-ui/src/components/form/index.tsx
index 811569f87a..b4cead1440 100644
--- a/dolphinscheduler-ui/src/components/form/index.tsx
+++ b/dolphinscheduler-ui/src/components/form/index.tsx
@@ -16,7 +16,7 @@
  */
 
 import { defineComponent, PropType, toRefs, h, unref } from 'vue'
-import { NSpin, NGrid, NForm, NFormItemGi } from 'naive-ui'
+import { NSpin, NGrid, NForm, NFormItemGi, FormRules } from 'naive-ui'
 import { useForm } from './use-form'
 import type { GridProps, IMeta } from './types'
 
@@ -50,7 +50,7 @@ const Form = defineComponent({
     const { elements = [], ...restFormProps } = meta
     return (
       <NSpin show={loading}>
-        <NForm {...restFormProps} ref='formRef'>
+        <NForm {...restFormProps} rules={meta.rules as FormRules} 
ref='formRef'>
           <NGrid {...layout}>
             {elements.map((element) => {
               const { span = 24, path, widget, ...formItemProps } = element
diff --git a/dolphinscheduler-ui/src/components/form/types.ts 
b/dolphinscheduler-ui/src/components/form/types.ts
index dfc02c792e..a9d3812c69 100644
--- a/dolphinscheduler-ui/src/components/form/types.ts
+++ b/dolphinscheduler-ui/src/components/form/types.ts
@@ -45,18 +45,29 @@ interface IFormItem {
   class?: string
 }
 
-interface IMeta extends Omit<FormProps, 'model'> {
+interface IMeta extends Omit<FormProps, 'model' | 'rules'> {
   elements?: IFormItem[]
   model: object
+  rules: IFormRules
 }
 
+interface IFormItemRule extends Omit<FormItemRule, 'required'> {
+  required?: boolean | Ref<boolean>
+}
+
+type IFormRules =
+  | {
+      [path: string]: IFormItemRule | IFormItemRule[]
+    }
+  | FormRules
+
 interface IJsonItemParams {
   field: string
   name?: string
   props?: any
   title?: string
   type?: IType
-  validate?: FormItemRule
+  validate?: IFormItemRule
   value?: any
   options?: IOption[] | Ref<IOption[]>
   children?: IJsonItem[]
@@ -65,7 +76,7 @@ interface IJsonItemParams {
   widget?: any
   class?: string
   path?: string
-  rule?: FormItemRule
+  rule?: IFormItemRule
 }
 
 type IJsonItemFn = (i?: number) => IJsonItemParams
@@ -81,5 +92,7 @@ export {
   FormRules,
   IFormItem,
   GridProps,
-  IJsonItemParams
+  IJsonItemParams,
+  IFormItemRule,
+  IFormRules
 }
diff --git a/dolphinscheduler-ui/src/components/form/utils.ts 
b/dolphinscheduler-ui/src/components/form/utils.ts
index fc41698afb..fc21c6c231 100644
--- a/dolphinscheduler-ui/src/components/form/utils.ts
+++ b/dolphinscheduler-ui/src/components/form/utils.ts
@@ -14,7 +14,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-import type { FormRules, FormItemRule } from './types'
+import type { FormRules, IFormItemRule } from './types'
 
 export function formatLabel(label?: string): string {
   if (!label) return ''
@@ -23,11 +23,11 @@ export function formatLabel(label?: string): string {
 }
 
 export function formatValidate(
-  validate?: FormItemRule | FormRules
-): FormItemRule {
+  validate?: IFormItemRule | FormRules
+): IFormItemRule {
   if (!validate) return {}
   if (Array.isArray(validate)) {
-    validate.forEach((item: FormItemRule) => {
+    validate.forEach((item: IFormItemRule) => {
       if (!item?.message) delete item.message
       return item
     })
diff --git 
a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx 
b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
index 30ec47b4fc..ed33a3d636 100644
--- a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
+++ b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/detail.tsx
@@ -24,7 +24,7 @@ import { useDetail } from './use-detail'
 import Modal from '@/components/modal'
 import Form from '@/components/form'
 import getElementByJson from '@/components/form/get-elements-by-json'
-import type { IRecord, FormRules, IFormItem } from './types'
+import type { IRecord, IFormRules, IFormItem } from './types'
 import type { PropType, Ref } from 'vue'
 
 interface IElements extends Omit<Ref, 'value'> {
@@ -48,7 +48,7 @@ const DetailModal = defineComponent({
   setup(props, ctx) {
     const { t } = useI18n()
 
-    const rules = ref<FormRules>({})
+    const rules = ref<IFormRules>({})
     const elements = ref<IFormItem[]>([]) as IElements
 
     const {
diff --git 
a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/types.ts 
b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/types.ts
index 12188f326d..6dd54959c5 100644
--- a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/types.ts
+++ b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/types.ts
@@ -17,8 +17,12 @@
 
 import type { IPluginId } from '@/service/modules/ui-plugins/types'
 import type { TableColumns } from 'naive-ui/es/data-table/src/interface'
-import type { IMeta, IJsonItem, IFormItem } from '@/components/form/types'
-import type { FormRules } from 'naive-ui'
+import type {
+  IMeta,
+  IJsonItem,
+  IFormItem,
+  IFormRules
+} from '@/components/form/types'
 
 interface IRecord {
   alertPluginName?: string
@@ -47,5 +51,5 @@ export {
   IMeta,
   IFormItem,
   TableColumns,
-  FormRules
+  IFormRules
 }
diff --git 
a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/use-form.ts 
b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/use-form.ts
index 389973b3a0..959361c38e 100644
--- a/dolphinscheduler-ui/src/views/security/alarm-instance-manage/use-form.ts
+++ b/dolphinscheduler-ui/src/views/security/alarm-instance-manage/use-form.ts
@@ -24,7 +24,7 @@ import {
 import type {
   IPluginId,
   IPlugin,
-  FormRules,
+  IFormRules,
   IMeta,
   IJsonItem,
   IRecord
@@ -60,13 +60,13 @@ export function useForm() {
       pluginDefineId: {
         trigger: ['blur', 'change'],
         required: true,
-        validator(validte, value) {
+        validator(unused: any, value: number) {
           if (!value && value !== 0) {
             return new Error(t('security.alarm_instance.select_plugin_tips'))
           }
         }
       }
-    } as FormRules
+    } as IFormRules
   } as IMeta
 
   const getUiPluginsByType = async () => {

Reply via email to